2012-02-02 64 views

回答

3

pthread_cond_*函數和pthread_mutex_*函數是NPTL的一部分,它現在是任何現代Linux機器上的glibc的一部分。最新版本是glibc-2.11.1,您可以在GNU glibc download site上找到源代碼。

+1

應該指出的是,這個實現有一些嚴重的未解決的錯誤,其中很多連接到:http://sourceware.org/bugzilla/show_bug.cgi?id=13165 – 2012-02-02 17:16:21

+0

@R ..哇,謝謝爲鏈接。這是非常不幸的,這些都是不正確的condvar實施的明確跡象。 – 2012-02-02 19:37:35

+0

是的。這一切似乎都源於他們正在試圖解釋清醒次數的一些黑魔法,顯然是爲了消除所有虛假清醒。然而,我已經從bug報告中運行了測試用例,同時針對NPTL condvar實現和我自己的實現,它們不使用任何這樣的黑客,也沒有能夠得到任何虛假的wakes,所以我的結論如此遠遠是他們防止虛假喚醒的努力是不必要的,並且(由於錯誤)簡直是有害的... – 2012-02-03 00:42:27

2

另一種選擇是OpenSolaris source;如果你對linux感興趣,也就是glibc,@David Schwartz的答案可能更「準確」。

0

雖然這不完全是您的問題的答案,但互斥鎖解鎖發生的重要方面是必須在之後執行條件變量結構更新以反映服務員存在。這是標準的意思,當它說功能「原子」解鎖互斥和等待。否則,就會出現相同的競爭條件,就像在調用pthread_cond_wait之前自己解鎖互斥體一樣:另一個線程可以獲取互斥體,並在檢查謂詞(並且發現它爲假)之後修改謂詞依賴的狀態,但在調用之前pthread_cond_wait。然後,你會錯過信號,並繼續等待cond var,或許永遠。