如果我鎖定了2個互斥體,並且每個互斥體都有一個condvar,有沒有簡單的方法可以等待或者 condvar發射?我想再次拿着兩把鎖,並且(至少)其中一個已經發出了信號。兩個互斥體condvar
回答
重新設計?不太瞭解你想做什麼:嘗試使用一個互斥體和多個condvars。如果你想等待condvar做出第三個condvar,當第一個或第二個被觸發時(或類似的東西)就會被觸發。
沒有簡單的方法,我可以看到,我會創建第三個condvar和mutex,因爲你真的在等待不同的條件。
不可以。您最終會遇到競爭狀況。假設兩個信號都在pthread_cond_wait
返回之前發送。一個人會被扔掉,而他們無法區分。
正如盧克所言,另一種思考方式是發生兩種不同的情況。當您收到信號時,請仔細檢查情況。如果有兩個條件,如果其他條件可能在您檢查時發生變化,則顯然會出現競爭狀態。
解決方案是有兩個不同的線程。如果這些線程需要獨佔,請使用另一個鎖來同步它們。
只需編寫完全符合您需要的同步功能即可。這樣做並沒有什麼內建的,但寫起來非常簡單。
一種方法是擁有一個主等待表,由它自己的互斥鎖保護。等待,您分配一個新的條件變量和新的等待對象。用等待的內容和新的條件變量填寫等待對象。您獲取主等待表互斥量,將您的對象添加到主等待表中,並阻止您自己的條件變量。要發出信號,你需要改變謂詞是什麼,獲得主等待表上的互斥量,查看哪些線程符合條件,併發出每個專用條件變量的信號。
在喚醒時,您必須獲取單個互斥鎖並重新檢查單個謂詞。它不會自動完成。
但最有可能的是,正確的解決方案是重新設計。最合乎邏輯的重新設計 - 爲什麼一個線程等待兩種不同的條件?如果有兩件事情可能發生,兩件事情發生時需要做兩件事情,那麼爲什麼一個線程做這兩件事?
通常,最好的設計更改是沒有線程等待這些事情。相反,當需要完成工作時,讓發現需要完成工作的條件的線程將工作項添加到隊列中。然後工作線程可以等待作業放置在該隊列中。如果需要處理兩個不同的條件,則可以由任何線程完成兩個作業。
- 1. 爲什麼默認不實施互斥,RWLock,CondVar,持續時間?
- 2. 爲什麼互斥體不需要互斥體(並且該互斥體需要互斥體...)
- 3. Node.js和互斥體
- 4. Ruby和互斥體
- 5. EventQueues和互斥體
- 6. 互斥體機制
- 7. 提升interprocess互斥體vs提升線程互斥體
- 8. 使用Allegro互斥體創建互斥體類
- 9. 在運行時選擇互斥體或虛擬互斥體
- 10. 互斥或不互斥互斥?
- 11. Silverlight中的互斥體
- 12. Linux內核互斥體
- 13. 線程和互斥體
- 14. Single Cron-Instance /互斥體
- 15. SQLite多線程互斥體
- 16. Windows Phone IsolatedStorageSettings&互斥體
- 17. 互斥體未初始化
- 18. 互斥體如何工作?
- 19. 如何使用互斥體
- 20. Win32中的互斥體
- 21. 用互斥體重建sem_wait()?
- 22. 分佈式互斥體
- 23. AIX是互斥體sempahores?
- 24. 跨用戶C#互斥體
- 25. 與smp的Java互斥體
- 26. 如何測試兩個pthread互斥體的相等性?
- 27. 兩個相互排斥的UIViews戰略
- 28. 如何製作兩個互斥的checkboxlists?
- 29. 多進程,一個互斥體
- 30. 多個互斥體上的Windows同步
不幸的是,這是一個測試,我不能真正得到其中一個互斥體。我想我會繼續嘲笑更多的東西,直到我下降到一個互斥量。 – 2010-07-29 18:24:42