在Linux內核中,信號量用於爲關鍵數據段提供互斥,並使用完成變量在等待事件的2個線程之間進行同步。爲什麼不使用信號量進行這種同步?在信號量上使用完成變量有什麼優勢?完成變量和信號量之間的差異
7
A
回答
9
有你可能想使用兩個原因完成而不是信號量。首先,多個線程可以等待完成,並且可以通過一次調用complete_all()
來釋放它們。讓一個信號量喚醒未知數量的線程會更復雜。其次,如果等待的線程將釋放同步對象,則如果使用信號量,則會出現競爭條件。也就是說,服務員可能會在喚醒線程完成up()
之前被喚醒並釋放對象。完成時不存在此種族。 (請參見Lasse的文章)
12
爲什麼完井最初執行說明: http://lkml.indiana.edu/hypermail/linux/kernel/0107.3/0674.html
的基本總結,我們必須通過具有的堆棧上的鎖定 信號燈等待 某些事件這 (很常見)的方式服務員, ,然後讓服務員做一個 「down()」,導致它阻止 ,直到它正在等待的東西做了 「up()」。
這工作得相當好,但這對SMP一個 真小(不太可能)賽事 ,也沒有那麼多的 比賽的想法本身,作爲 實現信號量的。我們 可能有固定的信號量,但 有不有幾個原因:對於非競爭的情況下
- 的信號燈優化(故意)。 的「等待完成」用法有 相反默認情況下
- 的信號量是相當複雜和具體的架構,正是
由於這種優化。試圖 改變他們是痛苦的地獄。所以不是,我介紹的 概念「等待完成」:
最近的線程約完井VS信號燈 http://lkml.org/lkml/2008/4/11/323
相關問題
- 1. 差異之間++變量,變量++
- 2. 互斥量和信號量之差= 1?
- 3. 類變量和實例變量之間的差異
- 4. 全局變量和對象變量之間的速度差異
- 5. 完成()和this.finish()之間的差異android
- 6. 變量的值之間的差異
- 7. TensorFlow變量和TensorFlow張量之間的實現差異
- 8. HUGE_VALF和INFINITY常量之間的差異
- 9. 信號量計數器和信號量方法之間的理解差異整數參數?
- 10. 信號量和R/W信號量之間的性能評估
- 11. C#,物業之間的差異變和不變量
- 12. 告訴鬆弛變量和原始變量之間的差異Z3
- 13. jQuery的變量,之間的差異有和沒有$前綴
- 14. 設置爲零和0的變量之間的差異
- 15. 關於引用變量,select和group_by之間的Dplyr差異?
- 16. $ Session變量和Getter/Setter之間的差異
- 17. fzero和fsolve之間的差異對於一個變量
- 18. 單例和全局變量之間的差異
- 19. 變量差異
- 20. 不理解變量聲明,符號,方法,實例變量,類變量之間的差異
- 21. 計算行向量和平均行向量之間的差異?
- 22. R編程:向量之間的差異
- 23. 量化數組之間的差異order
- 24. 大量行之間的差異
- 25. PyQt4的cellPressed和cellClicked信號之間的差異QTableWidget
- 26. 字符串爲二進制,常量和變量之間的轉換差異
- 27. 局部變量,實例變量和符號之間的混淆
- 28. jQuery $變量差異
- 29. **變量和變量[] []之間的區別?
- 30. 成員和方法之間的差異
需要注意的是POSIX一致性信號量實現可以避免Linux內核信號量在這種用法情況下的競爭,只要您有原子比較,就可以使其達到最佳狀態,並且 - 交換操作。看到我關於這個主題的問題以及到達的解決方案。 – 2012-01-03 05:36:22