secciones prueba peterson mutua lamport indice exclusión exclusion escritorio dekker criticas algoritmos algoritmo c# multithreading concurrency parallel-processing

c# - prueba - Variante de la confusión del algoritmo de Dekker



peterson algorithm (2)

Ambos ganan cuando se ejecutan en paralelo.

De la documentación ( http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.invoke.aspx ): Ejecuta cada una de las acciones proporcionadas, posiblemente en paralelo .

Este programa ejecuta dos hilos diferentes y me dice quién es el ganador de la "carrera".

Inesperadamente, AMBOS hilos "gana" (esperaba que alguien o nadie ganara). ¿Es este comportamiento esperado y por qué? Obviamente me falta algo fundamental aquí.

class Program { public volatile static int a = 0; public volatile static int b = 0; public static void Main() { for(int i = 0; i < 1000; i++) { a = 0; b = 0; Parallel.Invoke(delegate { a = 1; if (b == 0) Console.WriteLine("A wins"); }, delegate { b = 1; if (a == 0) Console.WriteLine("B wins"); }); Console.WriteLine(System.Environment.NewLine); Thread.Sleep(500); } } }

Resultados:

A wins B wins A wins B wins A wins ...


Estás usando volátiles incorrectamente:

declarar que las variables son volátiles no es suficiente, debe asegurarse de que, dondequiera que las lea / escriba, use Thread.VolatileRead(ref myVar) / Thread.VolatileWrite(ref myVar)

Además, volátil NO garantiza el orden de lectura / escritura (de diferentes hilos), incluso si se usa correctamente. Navegue SO para obtener información sobre el tema. EDITAR: parece que funciona en una máquina de un solo núcleo x86

Simplemente podría usar la declaración de lock , pero si quiere llegar al final de esto, recomiendo leer, comprender y luego leer de nuevo este libro electrónico gratuito.

ADICIONES:
Acabo de navegar a través de la clase Parallel en .NET 4, y en ninguna parte se usa la palabra clave volatile .
También copian la matriz de Action<T> antes de pasar sobre ella por alguna razón, pero dudo que eso te impacte.