2011-07-25 34 views
2

我需要編寫一個保存爲Dictionary的類。該字典將被多個線程訪問。 每次訪問都會很短。關於鎖定策略的問題(C#/ .NET 3.5 SP1)

我想到:

  • 每一分鐘,增加或刪除條目
  • 每2秒的訪問。我需要創建該字典的副本。運行對它的檢查(然後例如調用DB)
  • 每秒多次我將一個字段的值更新爲其中一個鍵。 (值是一個結構體)同一個鍵不會被同時訪問。

您會選擇哪種鎖定策略?爲什麼? 我的第一槍是使用ReaderWriterLockSlim。但是當我讀到它至少比Monitor慢兩倍時,我就不再那麼肯定了,因爲每次訪問字典時,我都會鎖定很短的時間。

TIA 馬丁

+2

.NET 4.0具有線程安全的ConcurrentDictionary類。 – Bas

回答

3

鑑於最頻繁的操作是和你永遠需要多個併發讀者據我所看到的,我只想用一個普通的鎖。我看不到ReaderWriterLockSlim會幫助你,它肯定會給你更復雜的代碼。

編輯:一種可能的優化是隻訪問寫入線程的變化列表。然後閱讀線程需要鎖定該列表只是,而它在處理它之前更新基礎字典。假設字典非常大,但變化列表相對較小,這意味着寫入線程會被阻塞的時間縮短很多。

實際上,您可以使用類似Queue而不是列表的方式,並且可能會使閱讀線程將小批量和退貨排隊,從而進一步減少了寫入線程的延遲 - 因此,如果處理有100次更改,讀線程可能會讀取其中的10個,這樣可以讓任何寫入線程阻塞等待添加到隊列中。

對此有更復雜的解決方案,具體取決於性能的重要性,特別是在延遲方面 - 但我會先從字典中鎖定一下。

+0

但是鑑於他需要每2秒從字典中複製(=讀取),簡單的鎖定會不會有更大的開銷? – sternr

+2

@sternr:爲什麼?鎖定本身很便宜 - 它的複製速度會很慢,而且你無法避免這種情況。當您複製您使用的任何鎖定策略時,您將無法做任何寫作。 –

+0

@sternr:AFAIK'lock'比'ReaderWriterLockSlim'快# –