このプログラムは2つの異なるスレッドを実行し、「レース」の勝者が誰であるかを教えてくれます。デッカーのアルゴリズムの混乱の変形
時には、両方のスレッドが「勝利」している(私は誰か、誰も勝つことを期待していない)。これは期待される行動ですか、なぜですか?私は明らかにここで基本的な何かを欠いている。
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);
}
}
}
結果:
A wins
B wins
A wins
B wins
A wins
...
実装を 'Parallel'から貧弱な古い' Thread'sに変更すると、うまくいくように思えます。なぜか分かりません。 –
@LB:興味深いのは、コア? –
'TaskCreationOptions.LongRunning'も正しく動作するように設定されています。 –