Bu program iki farklı iş parçacığı yürütür ve bana "yarış "ın kazananının kim olduğunu söyleyin.Dekker'ın algoritma karmaşasının değişkeni
Beklenmedik bir şekilde bazen BOTH iş parçacığı "kazanır" (birini ya da kazanacak birini beklemedim). Bu beklenen davranış ve neden? Açıkçası burada temel bir şey eksik.
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);
}
}
}
Sonuçlar:
A wins
B wins
A wins
B wins
A wins
...
Uygulamayı "Paralel" ten zayıf eski 'Thread' olarak değiştirirken, işe yarayacak gibi görünüyor. (Nedenini henüz bilmiyorsunuz.) –
@LB: İlginç, büyük olasılıkla, iş parçacıklarının aynı işlemci üzerinde çalışmasıdır. çekirdek? –
ayarı "TaskCreationOptions.LongRunning" ayarı da düzgün çalışmasını sağlıyor. –