Buscar..


Controlar el acceso a una variable en un bucle 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 );
    }
}

No es suficiente hacer simplemente sum = sum + i sin el bloqueo porque la operación de lectura-modificación-escritura no es atómica. Un hilo sobrescribirá cualquier modificación externa a la sum que ocurra después de que haya leído el valor actual de sum , pero antes de que almacene el valor modificado de sum + i nuevamente en sum .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow