Где прячется этот тупик?

На самом деле я пишу программу 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);
}

person Jérôme    schedule 11.02.2009    source источник
comment
Ты сделал всю домашнюю работу, маленькая Джи Би?   -  person claf    schedule 11.02.2009


Ответы (1)


Вы должны использовать один и тот же мьютекс для обоих условий (mutex_master и mutex_worker должны быть одинаковыми)

Кроме того, вы должны использовать pthread_cond_wait в цикле while, как это рекомендуется :)

person claf    schedule 11.02.2009