具有以下代码,我如何更新共享变量?Parallel.ForEach不更新共享变量
List<Person> list = new List<Person> {new Person {Age = 1}, new Person {Age = 2}, new Person {Age = 5}};
long total = 0;
Parallel.ForEach(list,() => 0, (person, loop, subtotal) =>
{
Add(person, subtotal);
return subtotal;
},
finalResult => Interlocked.Add(ref total, finalResult)
);
public static void Add(Person person, int shared)
{
// Do some work
shared =+ person.Age;
}
对于共享某种原因,回来为0
即使修复'ref小计问题',这也不会起作用。你有一个非常明显的竞争条件。你正在不断更新和阅读价值。 – Jonesopolis
那我该如何跟踪一个共享变量呢? – BobSwanson
@BobSwanson首先不要将总和并行化。这会比仅仅在一个线程中汇总值慢得多。除了更快,它也会更简单,更容易出错,更易于维护等。 – Servy