引述手冊頁:爲什麼pthread_cond_wait有虛假喚醒?
當使用條件變量始終存在涉及與每個條件等待這是真的,如果線程應進行相關的共享變量的布爾謂詞。可能會發生來自pthread_cond_timedwait()或pthread_cond_wait()函數的虛假喚醒。由於從pthread_cond_timedwait()或pthread_cond_wait()返回並不意味着這個謂詞的值,所以在返回時應該重新評估謂詞。
因此,即使您沒有發出信號,pthread_cond_wait
也會返回。乍一看,這似乎很殘酷。它會像一個函數,它在實際達到正確的返回語句之前隨機返回錯誤的值或隨機返回。這似乎是一個主要的錯誤。但他們選擇在手冊頁中記錄而不是修復它的事實似乎表明,爲什麼pthread_cond_wait
最終會虛假地醒來。據推測,它是如何工作的內在原因使得它無法得到幫助。問題是什麼。
爲什麼確實pthread_cond_wait
虛假地返回?爲什麼它不能保證只有當信號正確時才醒來?任何人都可以解釋其虛假行爲的原因嗎?
我可以想象它與處理捕獲信號時返回有關。大多數* nixes在信號中斷後不會重新啓動阻塞呼叫;他們只是設置/返回一個表示發生信號的錯誤代碼。 – cHao 2011-12-21 18:34:47
@cHao:雖然請注意,因爲條件變量無論如何都有*其他*虛假喚醒的原因,處理一個信號對於'pthread_cond_(timed)wait'不是一個錯誤:「如果一個信號被傳遞...線程恢復等待條件變量,如同它沒有中斷一樣,或者由於虛假喚醒它將返回零「。其他的阻塞函數表示當被一個信號中斷(例如'read')或者需要恢復(例如'pthread_mutex_lock')時'EINTR'。因此,如果沒有其他原因導致虛假喚醒,可以將pthread_cond_wait定義爲其中任何一種。 – 2011-12-21 19:09:41
維基百科上的一篇相關文章:[Spurious wakeup](http://en.wikipedia.org/wiki/Spurious_wakeup) – Palec 2015-01-07 22:51:49