# Parallel.For ループ内の変数へのアクセスを制御する
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main( string[] args )
{
object sync = new object();
int sum = 0;
Parallel.For( 1, 1000, ( i ) => {
lock( sync ) sum = sum + i; // lock is necessary
// As a practical matter, ensure this `parallel for` executes
// on multiple threads by simulating a lengthy operation.
Thread.Sleep( 1 );
} );
Console.WriteLine( "Correct answer should be 499500. sum is: {0}", sum );
}
}
sum = sum + i
だけでは不十分 読み取り-変更-書き込み操作はアトミックではないため、ロックなしで。スレッドは sum
への外部変更を上書きします sum
の現在の値を読み取った後に発生する 、ただし、変更された sum + i
の値を格納する前 sum
に戻ります .