【发布时间】:2011-02-16 18:22:28
【问题描述】:
我正在使用下面的代码
var processed = new List<Guid>();
Parallel.ForEach(items, item =>
{
processed.Add(SomeProcessingFunc(item));
});
上面的代码线程安全吗?处理列表是否有可能损坏?或者我应该在添加之前使用锁吗?
var processed = new List<Guid>();
Parallel.ForEach(items, item =>
{
lock(items.SyncRoot)
processed.Add(SomeProcessingFunc(item));
});
谢谢。
【问题讨论】:
-
你看过 MSDN 吗?这里:msdn.microsoft.com/en-us/library/…
-
@Martinho:是的。我读到 List
不是线程安全的。但我无法理解,即使将多个线程添加到列表中,这如何破坏列表。 -
@stackoverflowuser:一个例子:列表跟踪它有多少元素。当您添加一个时,它会将其放在下一个位置,并增加计数。好吧,这里有一个竞争条件:两个线程都可以添加一个元素,并且计数只增加一个(并且一个元素在这个过程中丢失了)。
-
@mellmokb:感谢您的链接。这很有帮助。
标签: c# list c#-4.0 task-parallel-library parallel-extensions