私は実際に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);
}