2009-02-11 39 views
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); 
} 
+0

没有你做所有的功课小G乙? – claf 2009-02-11 15:49:13

回答

2

您应该使用这两个条件相同的互斥(mutex_master和mutex_worker应该是相同的)

此外,你应该在一个while循环使用作为调用pthread_cond_wait它建议:)