Questo programma esegue due thread diversi e mi dice chi è il vincitore della "corsa".Confusione tra algoritmo di Dekker
Inaspettatamente a volte ENTRAMBI i thread "vince" (mi aspettavo che qualcuno o nessuno vincesse). È questo comportamento atteso e perché? Mi manca ovviamente qualcosa di fondamentale qui.
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);
}
}
}
Risultati:
A wins
B wins
A wins
B wins
A wins
...
Quando si modifica l'implementazione da 'Parallel' a povero' Thread's, sembra funzionare. (Non so perché ancora.) –
@LB: Interessante, è probabilmente perché i thread vengono eseguiti sullo stesso processore- nucleo? Anche l'impostazione –
'TaskCreationOptions.LongRunning' sembra funzionare correttamente. –