2015-09-10 55 views
5

我在某些環境中測試這種情況下,我得到了以下流程:pthread_cond_wait()是否可能消耗多個pthread_cond_signal()?

expected

然而,從該名男子頁(http://linux.die.net/man/3/pthread_cond_wait)或(http://linux.die.net/man/3/pthread_cond_signal),我找不到任何保證以下情況是不可能發生的:

scenario

這是2個線程做信號之前可以任意等待運行線程有機會運行。 (調度可能性)

[現在,我知道,如果這是與信號量完成,第二個場景中永遠不會發生......然而,在我來說,我真的需要COND - 瓦爾做到這一點!]

在我的例子中,每一篇文章都會增加謂詞,所以當等待的線程2喚醒時,它將檢查謂詞(在這種情況下增加2),使得線程不再睡覺,並且將謂詞遞減1那一個職位被消耗)。

如果這種情況可能發生,這將意味着,「線程1」可能沒有醒來,直到進一步後發生,雖然謂詞是增加了兩次(後)和遞減只有一次(在線程2 等待)。 更壞,第三個等待可能永遠不會阻塞,因爲它會消耗先前未決的謂詞增量。

我還不能觸發這個問題,但有誰知道這是否是一種可能的情況?


注意克服這種可能性我已經pthread_cond_broadcast()取代pthread_cond_signal()所以無論是Thread1Thread2保證醒來,消耗2個增量。然而,這個解決方案的性能有所下降(可能甚至不是很顯着),我敢打賭,任何人都不明白爲什麼我們在這裏使用廣播。

回答

7

不,它是不可能的一個pthread_cond_wait()消耗兩個信號。

pthread_cond_signal()保證喚醒當前等待條件變量的至少一個螺紋。一旦線程已經暗示,它不再等待條件變量(儘管它仍然可以在相關的互斥體在等待),所以後續的pthread_cond_signal()必須喚醒一個不同等待線程(如果有的話)。

(在第二個圖中,第二個信號必須以Thread2以外的線程爲目標,因爲Thread2不再等待該條件變量)。

POSIX spec for pthread_cond_signal的確切措辭是:

pthread_cond_signal()功能必須解除被阻塞在指定條件變量cond 其(如果有的話線程被阻塞上cond)的 線程中的至少一個。

+0

感謝您的回答。我假設一個線程被阻塞,直到執行的時刻(它試圖獲取互斥體的時刻)。那麼在操作系統上是否有一個機制來「標記」這些線程? (這意味着每個pthread_cond_signal()將「不標記」一個不同的線程?) – Pacheco

+1

@Pacheco:它取決於操作系統是如何實現的,但通常阻塞在條件變量上的進程將處於等待隊列中,併發信號通知條件變量自動將一個進程移出該隊列。 – caf

相關問題