2011-06-16 81 views
2

鑑於典型的例子爲條件變量使用互斥作爲條件變量

pthread_mutex_lock(&count_mutex); 
pthread_cond_wait(&count_threshold_cv, &count_mutex); 

然後我可以由另一個線程發出一個信號,該螺紋將繼續下去。

但我沒有看到剛剛嘗試鎖定互斥鎖時出現了什麼問題,並且如果執行鎖定,則線程將等待互斥鎖釋放。

這種方法的唯一問題是不斷輪詢?

感謝

回答

7

讓我們來具體說一下。你的建議的替代條件變量是爲「服務員」要做到這一點:

loop: 
    lock mutex 
    check predicate 
    if (predicate is false) 
     unlock mutex 
     sleep a bit // (is this what you had in mind?) 
     goto loop 

,併爲「信號發生器」要做到這一點:

lock mutex 
    make predicate true 
    unlock mutex 

這裏,「謂」可能是」隊列不是空的「,例如。

這種方法有兩個問題。第一個是你發現的問題:不斷的輪詢是低效的。如果你想象整個系統中的數百或數千個線程試圖以這種方式運行,它會使系統癱瘓。或者你的「睡一會兒」將會持續很長時間,以至於睡眠本身會加重煩人的延遲。

第二個問題更微妙。不能保證當一個線程解鎖一個互斥鎖並再次鎖定它時,另一個等待該互斥鎖的線程將被允許運行。 (這個互斥體的屬性被稱爲「公平性」;提供互斥體的互斥體被認爲是「公平的」。POSIX不要求要求互斥體公平)無論你在「服務員」中睡了多久不能保證「信號員」有史以來通過其lock mutex通話。

條件變量解決了這兩個問題。

0

條件變量信號變爲由互斥保護的數據結構。例如。您可能有一個由互斥鎖保護的隊列,當它變空時,您希望消費者等待條件變量,直到隊列不再爲空。你想以原子的方式釋放互斥體並在那種情況下等待。