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);
}
4

1 に答える 1

2

両方の条件に同じミューテックスを使用する必要があります (mutex_master と mutex_worker は同じにする必要があります)。

さらに、推奨されているように、 while ループで pthread_cond_wait を使用する必要があります:)

于 2009-02-11T11:48:25.200 に答える