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