有點混亂!如果我們看看下面的場景,會出現什麼問題:我的目標是瞭解條件變量與互斥鎖的混合。條件隨着互斥體變化
T1
- LOCK {MUTEX}
- CHECK VARIABLE
- 如果未設置,WAIT ON條件變量
- UNLOCK {MUTEX}轉到1
T2
- 修改變量;
- 信號條件變量
可能有步驟2和3之間的競爭條件,因此我們使用互斥體。我不明白的是cond var + mutex的基本思想。
有點混亂!如果我們看看下面的場景,會出現什麼問題:我的目標是瞭解條件變量與互斥鎖的混合。條件隨着互斥體變化
T1
T2
可能有步驟2和3之間的競爭條件,因此我們使用互斥體。我不明白的是cond var + mutex的基本思想。
有兩個問題與寫入結束省略鎖:
還要注意,條件變量的許多用途不僅僅是修改鎖中的一個標誌 - 例如它們可能會操縱鏈表或其他複雜的數據結構。在這種情況下,需要鎖來保護該數據結構以及條件變量。
還有一個更重要的原因:沒有鎖定,T2可以在T1執行步驟2和3之間執行步驟1和步驟2,然後T1將永久等待。 – caf
我要帶你的背景,你想要的行爲一些猜測,但我認爲你想要的東西看起來像這樣:
T1:
1.鎖互斥
2.檢查參數
3.解鎖互斥
4.等待條件變量
5.轉到1
T2:
1.鎖互斥
2.修改變量
3.解鎖互斥
4.信號條件變量
的互斥體是保護訪問的變量,讓你不會有不同的線程讀取,並在同一時間寫這一切都。
條件變量用於同步線程,以便您可以控制事件發生的順序。
你做錯了。條件變量具有與它們相關的互斥鎖。您需要先鎖定互斥鎖,然後再更改變量並將其釋放。
沒有死鎖 - pthread_cond_wait完全獲取關聯的互斥鎖作爲參數,因爲它可以解鎖互斥體時的互斥體(當您在等待條件變量的等待隊列中時釋放互斥體,這樣當條件變量發出信號時,你將感覺到被喚醒。
你想在這裏做什麼行爲?我可以解釋這段代碼是如何構造的,但我不明白它是如何做到有用的。 T1是否突破該循環?是否正在等待T2修改變量? – Erik
在修改變量之前,T2不應該鎖定互斥? – sizzle
會導致死鎖,因爲T1在等待條件變量時保持鎖定狀態發信號爲 – Erik