什麼是最適合這種任務的C#/ .NET中的mutex alg。互斥體機制
- 許多讀取
- 幾個增量變化(最多3個在「前進」狀態機)
- 非常低的碰撞機率(不碰撞概率事?)。
我在想簡單鎖定或ReaderWriterLockSlim,但我不確定選擇哪一個,以及是否有更好的任務。
謝謝。
什麼是最適合這種任務的C#/ .NET中的mutex alg。互斥體機制
我在想簡單鎖定或ReaderWriterLockSlim,但我不確定選擇哪一個,以及是否有更好的任務。
謝謝。
你將需要執行你自己的基準測試。我想你會發現在大多數情況下,即使大多數訪問限定爲只讀,簡單的舊lock
也會比ReaderWriterLockSlim
更快。原因是服務鎖的開銷要高得多。自從我做了基準測試以來已經有一段時間了,但我相信ReadWriterLockSlim
比lock
慢了大約5倍。顯然,長時間保持鎖定會降低開銷的總體影響。在某個時候它不再是主導因素。里程會根據不同情況而有所不同,所以您自己的基準是關於我可以在此給出的最佳建議。
它確實是短而快的算法,並且在大多數情況下我需要真的很短的時間,只是爲了改變狀態枚舉。 – 2010-09-29 22:29:31
然後我也會支持Brian的回答。即使是自旋鎖也許是一個很好的選擇。有C#自旋鎖嗎?甚至一個原始的compare_and_swap操作可能就足夠了。 – dmeister 2010-09-30 09:21:11
@dmeister:是的,.NET BCL包含'Interlocked.CompareExchange'和'SpinLock'類。 – 2010-09-30 15:12:09
我不太瞭解ReaderWriterLockSlim,但可以使用讀寫器互斥鎖 如果允許多個讀取並行訪問關鍵部分。如果這個假設是真的,取決於我們的用例。這通常是,但並非總是如此。
如果假設符合,讀者寫互斥體應該是一個很好的選擇。
在這種情況下,「碰撞概率」是什麼意思?兩個線程同時訪問臨界區的概率?
概率非常低,即使在很長時間內也是不穩定的,並且遠低於((處理時間)/(運行時間))^(步數) – 2010-09-29 17:29:20
雖然這是一箇舊的線程(後,無論),我遇到了一種獨特的方法來鎖定MutEx,這在某些情況下是有益的。
如果你的碰撞由多個實體希望訪問是罕見的,可以考慮以下方法:
例如:
想法是,如果有任何活動需要要鎖定但不影響你的代碼的結果(誠然,這個例子對於這種情況不是很好),你還沒有阻止其他代碼的執行。
雖然存在一些硬件,但它不再是「主流」:IBM System 370具有原子比較和更新指令以適應這種情況。
如果你想要一個有用的答案,你需要提供更多關於你的數據結構的信息。 – LukeH 2010-09-29 16:34:25