我讀了一本關於並行編程的它說,它不是線程保存元素添加到列表中,而無需使用鎖的結果將是不可預知的。例如,如果我們必須添加80萬個元素到列表中,最終結果將少於80萬個元素。C#與列表並行編程 - 正在讀線程安全?
現在我想知道是否線程保存到從列表中讀取元素。例如可以說,我有一個列表BlackListedNumbers
List<int> BlackListedNumbers = new List<int> {10, 50 ....... n};
//lets say there is 500 000 elements in the list
,並含有10 000 000號另一個列表Numbers
,很明顯,我將使用parallel.Foreach來完成這個任務,我要的是含所有數字Final
列表Numbers
不在BlackListedNumbers
列表
List<int> finalList = new List<int>();
Parallel.ForEach(Numbrs,
num =>
{
if (!blackListedNumbrs.Contains(num))
{
lock (finalList)
{
finalList.Add(num);
}
}
});
我知道這是不是得到這個工作最有效的方式,但我只是想說明問題。
所以我的問題是:是否有跟帖保存到閱讀列表blackListedNumbrs
結果,我會得到100%準確的結果?
對於列表,那就是安全的。然而,從多線程的數據結構中讀取數據通常是不安全的,即使是所謂的「不可變」結構。該集合仍然必須設計爲支持安全的多線程。請參閱http://blogs.msdn。com/b/ericlippert/archive/2011/05/23/read-only-and-threadsafe-are-different.aspx瞭解更多想法。 –