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.