我读了一本关于并行编程的它说,它不是线程保存元素添加到列表中,而无需使用锁的结果将是不可预知的。例如,如果我们必须添加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了解更多想法。 –