수색…


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 .



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow