2009-02-11 38 views
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); 
} 
+0

沒有你做所有的功課小G乙? – claf 2009-02-11 15:49:13

回答

2

您應該使用這兩個條件相同的互斥(mutex_master和mutex_worker應該是相同的)

此外,你應該在一個while循環使用作爲調用pthread_cond_wait它建議:)