2011-01-21 93 views
7

在Linux內核中,信號量用於爲關鍵數據段提供互斥,並使用完成變量在等待事件的2個線程之間進行同步。爲什麼不使用信號量進行這種同步?在信號量上使用完成變量有什麼優勢?完成變量和信號量之間的差異

回答

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

+0

需要注意的是POSIX一致性信號量實現可以避免Linux內核信號量在這種用法情況下的競爭,只要您有原子比較,就可以使其達到最佳狀態,並且 - 交換操作。看到我關於這個主題的問題以及到達的解決方案。 – 2012-01-03 05:36:22

相關問題