我正在嘗試設置幾個線程來處於等待狀態,直到他們收到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