2012-02-15 104 views
0

所以我有Dictionary<string, SomeClass>這將被多個併發線程嚴重訪問 - 有些人會寫,大部分都會閱讀。沒有鎖定,沒有同步 - 工作線程不會進行檢查 - 只需讀取或寫入。唯一的保證是沒有兩個線程將使用相同的密鑰寫入值。問題是這種數據結構是否會以這種方式被破壞?通過損壞我的意思是不工作了,即使只有一個線程。字典(的TKey,TValue)併發訪問:最糟糕的場景

+1

你是什麼意思*沒有再工作*? – Yuck 2012-02-15 21:12:18

+0

@Yuck嗯,拋出一些怪異的例外,而執行正常的操作或類似的東西。 Msdn只說「不是線程安全的」,而沒有詳細說明。這是否意味着腐敗的可能性或操作的非原子性? – ren 2012-02-15 21:17:00

+1

「不是線程安全的」不需要更多細節,通常很難列出所有可能的錯誤。真正討厭的只發生一年一次左右。很好,當你必須找到/ repro他們。 – 2012-02-15 21:21:53

回答

5

最壞情況的方案包括:

  • 的NullReferenceException或IndexOutOfRangeException拋出一個字典<,>方法的。

  • 任意數量的數據丟失。如果兩個線程試圖同時調整字典<>>表,他們可以跺腳,擰緊,並丟失數據。

  • 錯誤的答案返回通過從字典<,>讀。

基本上,字典<,>可以做任何事情壞的,你能想到的,由CLR所施加的限制之內。據推測,你仍然不會像使用本地編程語言那樣破壞類型安全或破壞堆。也許,反正:-)

7

這樣的數據結構可能會被破壞嗎?

是的,很可能你會得到一個IndexOutOfRange或類似的異常。
即使您捕捉並忽略異常,您也不會再獲得可靠的數據。重複和缺失值都是可能的。

所以不要這樣做。

+0

+1。特別是,從文檔(http://msdn.microsoft.com/en-us/library/xfhwa508.aspx):「字典(TKey,TValue)可同時支持多個閱讀器,只要該集合未被修改即使如此,通過集合枚舉本質上不是一個線程安全的過程,在枚舉與寫入訪問爭奪的罕見情況下,集合必須在整個枚舉過程中被鎖定,以允許集合被多個線程訪問閱讀和寫作,你必須實現你自己的同步。「 – 2012-02-15 21:19:23

2

如果您正在訪問從多個線程的集合,這將是最安全的方法是.NET 4的線程安全的品種之一,如ConcurrentDictionary

相關問題