2016-01-18 73 views
0

這個問題涉及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導致線程關聯的互斥鎖,就好像他們都試圖鎖定它競爭,這是否意味着只有一個線程真的會醒過來?

回答

3

當某些線程調用pthread_cond_broadcast時,持有互斥量,它保存互斥量。這意味着一旦pthread_cond_broadcast返回,它仍然擁有互斥量。

其他線程都會喚醒,嘗試鎖定互斥鎖,然後進入睡眠狀態等待互斥鎖變爲可用。

如果您撥打pthread_cond_broadcast,而不是保持該互斥,則其他線程之一將能夠立即鎖定該互斥。所有其他人將不得不等待鎖定互斥鎖。

+0

嗯...所以'pthread_cond_signal'和'pthread_cond_broadcast'實際上對任何互斥量都沒有影響嗎?只是'pthread_cond_wait'試圖在發信號後立即重新鎖定一個互斥鎖? –

+0

@WilliamRosenbloom pthread_cond_wait具有一些魔力,可以自動完成任務,但除此之外,它就像通常解鎖/鎖定互斥鎖一樣。 – immibis

相關問題