Ten program wykonać dwa różne wątki i powiedz mi, kto jest zwycięzcą "wyścigu".Wariant zamieszania Dekkera algorytm
Niespodziewanie czasami OBA wątki "wygrywa" (oczekiwałem, że ktoś lub nikt nie wygra). Czy to oczekiwane zachowanie i dlaczego? Najwyraźniej brakuje mi czegoś fundamentalnego.
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);
}
}
}
Wyniki:
A wins
B wins
A wins
B wins
A wins
...
Podczas zmiany implementacji z 'Równoległego' na kiepski stary wątek, wydaje się, że działa. (Nie wiem dlaczego jeszcze.) –
@LB: Interesujące, prawdopodobnie dlatego, że wątki działają na tym samym procesorze- rdzeń? –
ustawienie 'TaskCreationOptions.LongRunning' również wydaje się, że działa poprawnie. –