鑑於典型的例子爲條件變量使用互斥作爲條件變量
pthread_mutex_lock(&count_mutex);
pthread_cond_wait(&count_threshold_cv, &count_mutex);
然後我可以由另一個線程發出一個信號,該螺紋將繼續下去。
但我沒有看到剛剛嘗試鎖定互斥鎖時出現了什麼問題,並且如果執行鎖定,則線程將等待互斥鎖釋放。
這種方法的唯一問題是不斷輪詢?
感謝
鑑於典型的例子爲條件變量使用互斥作爲條件變量
pthread_mutex_lock(&count_mutex);
pthread_cond_wait(&count_threshold_cv, &count_mutex);
然後我可以由另一個線程發出一個信號,該螺紋將繼續下去。
但我沒有看到剛剛嘗試鎖定互斥鎖時出現了什麼問題,並且如果執行鎖定,則線程將等待互斥鎖釋放。
這種方法的唯一問題是不斷輪詢?
感謝
讓我們來具體說一下。你的建議的替代條件變量是爲「服務員」要做到這一點:
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
通話。
條件變量解決了這兩個問題。
條件變量信號變爲由互斥保護的數據結構。例如。您可能有一個由互斥鎖保護的隊列,當它變空時,您希望消費者等待條件變量,直到隊列不再爲空。你想以原子的方式釋放互斥體並在那種情況下等待。