2009-04-17 74 views
3

在什麼情況下應該使用以下每個同步對象?什麼時候應該使用每個線程同步對象?

  1. 讀寫器鎖
  2. 信號燈
  3. 互斥
+2

在我的眼裏,要求後者的公平性)的極爲罕見的情況下,它*是*一個問題(標題+列表),只是問不好。對我來說沒有直接的原因關閉,他可以爲他人編輯它是更具體的 – Gregor 2009-04-17 12:15:33

回答

5
  • 由於每次調用post()時,wait()都會返回一次,所以信號量是一個基本的生產者 - 消費者模型 - 除ma之外的最簡單的線程間消息形式ybe信號。它們被用來讓一個線程可以告訴另一個線程發生了一些它感興趣的事情(以及多少次)以及管理對最多隻有固定有限數量的用戶的資源的訪問。它們提供多線程代碼所需的訂購保證。

  • Mutexes做他們所說的話 - 「互斥」。他們確保訪問某些資源的權利一次只能在線程中「持有」。這就保證了多線程代碼所需的原子性和順序。在大多數操作系統中,他們還提供相當複雜的服務員行爲,尤其是爲了避免優先倒置。

注意,信號量可以很容易地被用來實現互斥,但因爲信號不具有「所有者線程」,你沒有得到優先級反轉回避旗語。所以它們不適合需要「鎖定」的所有用途。

  • 讀寫器鎖超過互斥的優化,在情況下,你將有很多爭論,大多數訪問是隻讀的,並且同時讀取是允許的數據結構受到保護。在這種情況下,只有在涉及作者時才需要排除 - 讀者不需要被排除在彼此之外。爲了促使讀者寫作者,所有其他讀者必須在獲得作者鎖之前完成(或放棄並開始等待重試,如果他們也想成爲作家)。 ReaderWriter鎖在速度不夠快的情況下可能會變慢,原因在於它們通過互斥來進行額外的簿記。

  • 條件變量用於允許線程等待某些事實或事實的組合爲真,其中有問題的條件比信號量的「已被戳穿」更復雜,或「沒有其他人正在使用它「用於讀寫器鎖定的讀寫器鎖定的互斥鎖和寫入器部分,或者」沒有寫入者正在使用它「。它們也用於不同等待線程的觸發條件不同的情況,但取決於部分或全部相同狀態(存儲位置或其他)。

  • 旋轉鎖適用於在一個處理器或內核上等待很短時間(如幾個週期),而另一個內核(或I/O總線等硬件)同時進行時一些你關心的工作。在某些情況下,它們會比其他原語(如信號量或中斷)提高性能,但必須非常謹慎地使用(因爲無鎖算法在現代內存模型中很難實現),並且只有在證明必要時才能使用(因爲避免系統原語往往是不成熟的優化)。

順便說一句,這些答案不是特定於C#(因此,例如關於「大多數操作系統」的評論)。理查德說,在C#中你應該在適當的時候使用普通的舊鎖。我相信監視器是一個互斥/條件變量對滾動到一個對象。

1

我會說他們每個人都可以是 「最好的」 - 依賴於使用情況;-)

1

簡單的答案:幾乎從不。

最好的鎖定類型是不需要鎖定(不共享可變狀態)。

如果你確實需要一個鎖,嘗試使用一個監視器(通過lock語句),除非你有一些不同的特定需求(在這種情況下看到Onebyone的回答

此外,喜歡ReaderWriteLockSlimReaderWriterLock(除在

相關問題