これが「正しい」方法です。これにより、最終的な合計オブジェクトをロックする必要がなくなり、各ローカルスレッドのループの最後にインターロックされた操作を実行するだけで済みます。
int x = 0;
Parallel.For(0, 100,
() => 0, //LocalInit
(i, loopstate, outerlocal) =>
{
Parallel.For(i + 1, 100,
() => 0, //LocalInit
(a, loopState, innerLocal) => { return innerLocal + 1; },
(innerLocal) => Interlocked.Add(ref outerlocal, innerLocal)); //Local Final
return outerlocal;
},
(outerLocal) => Interlocked.Add(ref x, outerLocal)); //Local Final
Parallel
ただし、この小さな作業を2つのネストされたステートメントで実行することは、おそらく悪い考えです。考慮する必要のあるオーバーヘッドコストがあります。このような少量の作業を行う場合は、Parallel
ステートメントを1つだけ実行するか、まったく実行しない方がはるかに優れています。
並列プログラミングのパターンをダウンロードして読むことを強くお勧めします。このような小さなネストされた並列ループが適切でない理由について詳しく説明します。