我正在尝试设置几个线程来处于等待状态,直到他们收到pthread_cond_broadcast()
。pthread播放然后等待?
完成作业后,我想线程返回到他们的等待状态。
我也想那个叫pthread_cond_broadcast()
等待所有线程,然后再继续回到自己的等待状态的过程。在这种情况下,它是调用广播的main()函数。我试图做的板状的这个B(0做一个pthread_cond_wait()
调用播出后。
void* Work::job(void* id)
{
int idx = (long)id;
while(1)
{
pthread_mutex_lock(&job_lock);
while(!jobs_complete)
{
// wait for main to broadcast
pthread_cond_wait(&can_work, &job_lock);
pthread_mutex_unlock(&job_lock);
// work here
pthread_mutex_lock(&job_lock);
++jobs_completed;
if(jobs_completed == NUM_THREADS)
{
jobs_complete = true;
pthread_cond_signal(&jobs_done);
pthread_mutex_unlock(&job_lock);
}
pthread_mutex_unlock(&job_lock);
}
pthread_mutex_unlock(&job_lock);
}
return NULL;
}
NUM_THREADS是4,job_lock是pthread_mutex_t
,can_work和jobs_done是pthread_cond_t
, jobs_completed是bool
和jobs_complete为int
。
// work
jobs_completed = false;
jobs_complete = 0;
pthread_mutex_lock(&job_lock);
pthread_cond_broadcast(&can_work);
pthread_cond_wait(&jobs_complete);
pthread_mutex_unlock(&job_lock);
// work that depends on jobs_complete
现在,我正在通过调用pthread_cond_broadcast()
然后pthread_cond_wait()
后立即执行此操作,但这似乎是僵局。
谁能解释我应如何做这个或者我哪里错了?我会很感激任何帮助。
谢谢!
它看起来* *喜欢你试图etup一堆线程给所有人等待“去”信号,然后它们集中完成NUM_THREAD个作业,理想情况下每个线程一个,并且一旦NUM_THREAD作业完成,返回等待另一个去信号。这是否准确?我已经看到不少于五个错误,但是想要在确定答案之前确切地知道你想要做什么。 – WhozCraig 2013-03-28 07:48:58
@WhozCraig,是的,这是我正在尝试做的。我还希望调用“发送”信号的功能在继续之前等待所有作业完成。 – noko 2013-03-28 08:04:06