具有以下代碼,我如何更新共享變量?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