這個問題涉及Posix系統的pthread API。pthread_cond_broadcast之後哪個線程擁有關聯的互斥鎖?
我的理解是,當等待一個條件變量,或更具體地說是一個pthread_cond_t
,流程就像這樣。
// imagine the mutex is named mutex and the conditional variable is named cond
// first we lock the mutex to prevent race conditions
pthread_mutex_lock(&mutex);
// then we wait for the conditional variable, releasing the mutex
pthread_cond_wait(&cond, &mutex);
// after we're done waiting we own the mutex again have to release it
pthread_mutex_unlock(&mutex);
在這個例子中,當一些其他線程遵循這樣的過程時,我們停止等待互斥量。
// lock the mutex to prevent race conditions
pthread_mutex_lock(&mutex);
// signal the conditional variable, giving up control of the mutex
pthread_cond_signal(&cond);
我的理解是,如果多個線程正在等待某種調度策略將被應用,並取其線暢通也回來關聯的互斥鎖。
現在我不明白是當某些線程調用pthread_cond_broadcast(&cond)
醒來,等待條件變量的線程所有會發生什麼。
只有一個線程擁有互斥鎖嗎?在等待廣播時,我是否需要以一種根本不同的方式等待,而不是等待信號時(例如,如果我不能確認此線程已獲得互斥體,則不要致電pthread_mutex_unlock
)?或者我錯誤地理解了互斥/共享關係是如何工作的?
最重要的,如果(我想可能是這種情況)pthread_cond_broadcast
導致線程關聯的互斥鎖,就好像他們都試圖鎖定它競爭,這是否意味着只有一個線程真的會醒過來?
嗯...所以'pthread_cond_signal'和'pthread_cond_broadcast'實際上對任何互斥量都沒有影響嗎?只是'pthread_cond_wait'試圖在發信號後立即重新鎖定一個互斥鎖? –
@WilliamRosenbloom pthread_cond_wait具有一些魔力,可以自動完成任務,但除此之外,它就像通常解鎖/鎖定互斥鎖一樣。 – immibis