C 这个死锁藏在哪里?

C 这个死锁藏在哪里?,c,multithreading,pthreads,deadlock,C,Multithreading,Pthreads,Deadlock,我实际上在写一个MPI程序。这是一种基本的客户机/服务器模式。服务器有一组工作要计算。客户可以得到这个大集合的子集。每个客户端使用多个线程来计算子集。在向服务器请求另一个子集之前,我必须确保所有线程都已完成 客户端被分成几个线程:一个主线程(用于通信)和几个工作线程 这里是我的实际代码,死锁应该发生在这里。我清除了它的任何MPI调用,以使它更具可读性。我真的看不出我做错了什么 void* worker ( void * arg ) { while (work != 0) { int

我实际上在写一个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);
}
void*工作者(void*arg){
while(工作!=0){
int x;
while(获取作业(&x)){
做你的工作(x);
}
pthread_mutex_lock(&mutex_worker);
nb_job_empty++;
if(nb_作业\u空==nb_线程){
nb_job_empty=0;
pthread_cond_信号(&cond_master);
}
nb_工人_醒来--;
pthread_cond_wait(&cond_worker,&mutex_worker);
nb_工人_唤醒++;
pthread_mutex_unlock(&mutex_worker);
}
返回(void*)0;
}
void服务器(){
对于(int i=0;i<100;i++){
添加作业();
pthread_mutex_lock(&mutex_master);
pthread_cond_广播(&cond_worker);
pthread_cond_wait(&cond_master,&mutex_master);
pthread_mutex_unlock(&mutex_master);
}
功=0;
pthread_mutex_lock(&mutex_master);
pthread_cond_广播(&cond_worker);
pthread_mutex_unlock(&mutex_master);
}

两种情况下应使用相同的互斥体(互斥体\u主设备和互斥体\u工作设备应相同)


此外,您应该在while循环中使用pthread\u cond\u wait,这是推荐的:)

您的所有作业都完成了吗?