2010-09-29 108 views
0

什麼是最適合這種任務的C#/ .NET中的mutex alg。互斥體機制

  • 許多讀取
  • 幾個增量變化(最多3個在「前進」狀態機)
  • 非常低的碰撞機率(不碰撞概率事?)。

我在想簡單鎖定或ReaderWriterLockSlim,但我不確定選擇哪一個,以及是否有更好的任務。

謝謝。

+0

如果你想要一個有用的答案,你需要提供更多關於你的數據結構的信息。 – LukeH 2010-09-29 16:34:25

回答

1

你將需要執行你自己的基準測試。我想你會發現在大多數情況下,即使大多數訪問限定爲只讀,簡單的舊lock也會比ReaderWriterLockSlim更快。原因是服務鎖的開銷要高得多。自從我做了基準測試以來已經有一段時間了,但我相信ReadWriterLockSlimlock慢了大約5倍。顯然,長時間保持鎖定會降低開銷的總體影響。在某個時候它不再是主導因素。里程會根據不同情況而有所不同,所以您自己的基準是關於我可以在此給出的最佳建議。

+1

它確實是短而快的算法,並且在大多數情況下我需要真的很短的時間,只是爲了改變狀態枚舉。 – 2010-09-29 22:29:31

+0

然後我也會支持Brian的回答。即使是自旋鎖也許是一個很好的選擇。有C#自旋鎖嗎?甚至一個原始的compare_and_swap操作可能就足夠了。 – dmeister 2010-09-30 09:21:11

+0

@dmeister:是的,.NET BCL包含'Interlocked.CompareExchange'和'SpinLock'類。 – 2010-09-30 15:12:09

0

我不太瞭解ReaderWriterLockSlim,但可以使用讀寫器互斥鎖 如果允許多個讀取並行訪問關鍵部分。如果這個假設是真的,取決於我們的用例。這通常是,但並非總是如此。

如果假設符合,讀者寫互斥體應該是一個很好的選擇。

在這種情況下,「碰撞概率」是什麼意思?兩個線程同時訪問臨界區的概率?

+0

概率非常低,即使在很長時間內也是不穩定的,並且遠低於((處理時間)/(運行時間))^(步數) – 2010-09-29 17:29:20

1

雖然這是一箇舊的線程(後,無論),我遇到了一種獨特的方法來鎖定MutEx,這在某些情況下是有益的。

如果你的碰撞由多個實體希望訪問是罕見的,可以考慮以下方法:

  • 採集,用鎖(S)(互斥體(S)...無論),相關數據
    • 的副本確保複製的項目至少有一個就足夠了比較 對照原文,以檢測是否已經 發生變化
    • 解除鎖定(S)
  • 對副本進行了操作,又保持穩定的比較項目
  • 獲取鎖(S)
  • ,其原有的比較參考項以確定是否發生變化發生
  • 如果沒有,申請的結果 如果是這樣,放棄你的結果,重新獲得副本,並重新開始
    • 解除鎖定(S)

例如:

  1. 鎖定支票賬戶和儲蓄賬戶;獲取餘額和最近交易時間的副本;解鎖
  2. 計算更改...例如,從儲蓄轉移$ 5到檢查
  3. 再次鎖定帳戶;比較交易時間的實際與您的副本 - 如果它們匹配,則應用計算的值並解鎖,如果不匹配,則重新獲取,解鎖並重新啓動

想法是,如果有任何活動需要要鎖定但不影響你的代碼的結果(誠然,這個例子對於這種情況不是很好),你還沒有阻止其他代碼的執行。

雖然存在一些硬件,但它不再是「主流」:IBM System 370具有原子比較和更新指令以適應這種情況。