我实际上是在写一个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);
}
答案 0 :(得分:2)
你应该对两种情况使用相同的互斥量(mutex_master和mutex_worker应该是相同的)
此外,您应该在while循环中使用pthread_cond_wait,因为建议:)