【发布时间】:2015-02-24 22:15:03
【问题描述】:
我找不到阻止这种竞争状况的方法。主线程调用广播例程唤醒所有线程,然后调用 cond_wait 等待所有线程完成。最后一个完成的线程向主线程发出信号。问题有时是当主线程进行广播时,并非所有工作线程都在等待条件变量。代码有点乱,因为我正在尝试各种修复。
unsigned nProcs, curProc;
pthread_mutex_t WORKlock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t MAINlock = PTHREAD_MUTEX_INITIALIZER;
pthread_mute_t wj_varlock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t WORKsig = PTHREAD_COND_INITIALIZER;
pthread_cond_t MAINsig = PTHREAD_COND_INITIALIZER;
void *do_work(void *t)
{
static unsigned offset = 0;
unsigned myoff = offset++, locked = 0;
volatile int nc;
while(1)
{
if(locked == 0)
pthread_mutex_lock(&WORKlock);
else
locked = 0;
pthread_cond_wait(&WORKsig, &WORKlock);
pthread_mutex_unlock(&WORKlock);
// this is where the work gets done
//sleep(1);
printf("thread %d done!\n", myoff);
pthread_mutex_lock(&wj_varlock);
nc = --curProc;
pthread_mutex_unlock(&wj_varlock);
if(nc == 0)
{
pthread_mutex_lock(&WORKlock);
locked = 1;
pthread_cond_signal(&MAINsig);
}
}
}
void main(int argc, char **argv)
{
unsigned i, k;
pthread_t pth;
nProcs = get_nprocs(); // get number of core from system
for(i = 0; i < nProcs; ++i)
{
k = pthread_create(&pth, NULL, do_work, NULL);
if(k != 0)
{
perror("pthread_create");
exit(k);
}
}
pthread_mutex_lock(&MAINlock);
while(1)
{
//prepare work to be done
puts("work prep");
//sleep(1);
curProc = nProcs; // use global var to track active threads
pthread_cond_broadcast(&WORKsig);
pthread_cond_wait(&MAINsig, &MAINlock);
}
}
【问题讨论】: