我正在尝试设置几个线程,使其处于等待状态,直到它们收到
完成作业后,我希望线程返回到它们的等待状态。
我还希望调用
pthread_cond_broadcast()
。完成作业后,我希望线程返回到它们的等待状态。
我还希望调用
pthread_cond_broadcast()
的进程在继续之前等待所有线程返回到它们的等待状态。 在这种情况下,调用广播的是主函数。 我正在尝试让main()在调用广播后执行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()
来执行此操作,但似乎会出现死锁。
请问有人能解释我应该如何执行此操作,或者我错在了哪里吗?我会非常感激任何帮助。
谢谢!