2
我實際上正在編寫一個MPI程序。這是一個基本的客戶端/服務器模式。服務器有一組計算工作。客戶得到這個大集合的子集。每個客戶使用多個線程來計算子集。在向服務器請求另一個子集之前,我必須確定所有線程都已完成。這個僵局在哪裏隱藏?
客戶端分爲幾個線程:一個主(用於通信)和幾個工人。
在這裏我的實際代碼,應該發生死鎖。我清理了任何MPI調用,以使其更具可讀性。我真的不明白我在這裏做錯了什麼。
void* worker (void * arg) {
while (work != 0) {
int x;
while (get_job(&x)) {
do_job(x);
}
pthread_mutex_lock(&mutex_worker);
nb_job_empty++;
if (nb_job_empty == NB_THREADS) {
nb_job_empty = 0;
pthread_cond_signal(&cond_master);
}
nb_worker_woken--;
pthread_cond_wait(&cond_worker, &mutex_worker);
nb_worker_woken++;
pthread_mutex_unlock(&mutex_worker);
}
return (void *) 0 ;
}
void server() {
for (int i = 0; i < 100; i++) {
add_job();
pthread_mutex_lock(&mutex_master);
pthread_cond_broadcast(&cond_worker);
pthread_cond_wait(&cond_master, &mutex_master);
pthread_mutex_unlock(&mutex_master);
}
work = 0;
pthread_mutex_lock(&mutex_master);
pthread_cond_broadcast(&cond_worker);
pthread_mutex_unlock(&mutex_master);
}
沒有你做所有的功課小G乙? – claf 2009-02-11 15:49:13