フォローコードがあるので、どのように共有変数を更新できますか?共有何らかの理由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;
}
が、それは「通常の」C#コードでは動作しません0
これは、 'ref subtotal'問題を修正しても機能しません。あなたは非常に明白な競争状態を持っています。常に値を更新して読み込みます。 – Jonesopolis
どのように共有変数を追跡することができますか? – BobSwanson
@BobSwanson最初に和を並列化しないでください。単一のスレッドで値を合計するよりもはるかに遅くなります。はるかに速くなるだけでなく、エラーも発生しやすく、メンテナンスも簡単です。 – Servy