我在某些環境中測試這種情況下,我得到了以下流程:pthread_cond_wait()是否可能消耗多個pthread_cond_signal()?
然而,從該名男子頁(http://linux.die.net/man/3/pthread_cond_wait)或(http://linux.die.net/man/3/pthread_cond_signal),我找不到任何保證以下情況是不可能發生的:
這是2個線程做信號之前可以任意等待運行線程有機會運行。 (調度可能性)
[現在,我知道,如果這是與信號量完成,第二個場景中永遠不會發生......然而,在我來說,我真的需要COND - 瓦爾做到這一點!]
在我的例子中,每一篇文章都會增加謂詞,所以當等待的線程2喚醒時,它將檢查謂詞(在這種情況下增加2),使得線程不再睡覺,並且將謂詞遞減1那一個職位被消耗)。
如果這種情況可能發生,這將意味着,「線程1」可能沒有醒來,直到進一步後發生,雖然謂詞是增加了兩次(後)和遞減只有一次(在線程2 等待)。 更壞,第三個等待可能永遠不會阻塞,因爲它會消耗先前未決的謂詞增量。
我還不能觸發這個問題,但有誰知道這是否是一種可能的情況?
注意克服這種可能性我已經pthread_cond_broadcast()
取代pthread_cond_signal()
所以無論是Thread1
和Thread2
保證醒來,消耗2個增量。然而,這個解決方案的性能有所下降(可能甚至不是很顯着),我敢打賭,任何人都不明白爲什麼我們在這裏使用廣播。
感謝您的回答。我假設一個線程被阻塞,直到執行的時刻(它試圖獲取互斥體的時刻)。那麼在操作系統上是否有一個機制來「標記」這些線程? (這意味着每個pthread_cond_signal()將「不標記」一個不同的線程?) – Pacheco
@Pacheco:它取決於操作系統是如何實現的,但通常阻塞在條件變量上的進程將處於等待隊列中,併發信號通知條件變量自動將一個進程移出該隊列。 – caf