據我所知,pthread_cond_wait()被記錄爲虛假喚醒,調用者必須檢查該情況,並且其動機是爲了允許pthread_cond_wait()的實現具有更好的性能並強制調用者創建更強大的碼。爲什麼允許pthread_cond_wait()有時會得到虛假的喚醒提升性能?
但是,我還沒有看到任何人對此提供的性能機會有具體的瞭解,但除了提到避免昂貴的競爭條件之外。
有人可以詳細瞭解什麼樣的競爭條件會出現,以確保沒有虛假喚醒和硬件架構會導致這種情況出現嗎?
據我所知,pthread_cond_wait()被記錄爲虛假喚醒,調用者必須檢查該情況,並且其動機是爲了允許pthread_cond_wait()的實現具有更好的性能並強制調用者創建更強大的碼。爲什麼允許pthread_cond_wait()有時會得到虛假的喚醒提升性能?
但是,我還沒有看到任何人對此提供的性能機會有具體的瞭解,但除了提到避免昂貴的競爭條件之外。
有人可以詳細瞭解什麼樣的競爭條件會出現,以確保沒有虛假喚醒和硬件架構會導致這種情況出現嗎?
不能保證您的線程在發送信號時會立即運行。它只是被標記爲「準備好」,並且將在系統調度器的支配下運行。在這段時間之間它變得可調度並且它實際上被調度的時間,另一個線程可能已經改變了基本條件。
例如:
線程A: 等待條件變量。
線程B: 更新狀態。 信號條件變量。
線程C: 復位狀態
線程A: 喚醒。 檢查底層狀態,它不變。
這不是一個虛假的喚醒 - condvar已被髮信號。來自Wiki:'其中一個原因是虛假喚醒;也就是說,即使沒有線程指示條件,線程也可能會被喚醒。這就是,恕我直言,在Unix/Linux上說'condvars的另一種方式不能正常工作,必須在用戶代碼中應用修補程序。幸運的是,這被condvars的設計所掩蓋,這意味着無論如何都必須應用循環檢查。 – 2012-04-04 10:45:53
事實證明,真正的動機顯然是強迫用戶檢查循環中的謂詞 - 可能的性能好處似乎有些次要的:http://stackoverflow.com/a/8594644/12711但是,這裏是一個錯誤報告,指出NPTL可能會通過嘗試*防止虛假喚醒來引入錯誤:http://sourceware.org/bugzilla/show_bug.cgi?id=13165#c13我僅以評論的形式呈現此內容,因爲我不'不知道錯誤報告是否有效(比賽是複雜的事情)。 – 2012-04-03 20:06:20
我認爲這是相反的。可以理解謂詞應該被重新檢查,因爲condvar沒有狀態,(不像信號燈那樣)。這個檢查循環涵蓋了即使condvar沒有被髮信號也會發生的任何虛假喚醒。 – 2012-04-04 10:55:06