タイトルが変だと思うかもしれませんので、説明させてください。多くの場合、競合状態について教えている人はx == 0
、スレッド 2 が既に認識しているのに、スレッド 1 は認識できると言っています。x=1;
私の質問は、同じコアでスケジュールされたスレッドに関するものです (非現実的ではありません。まだ 1 つのコアが組み込まれたシステムがあり、少なくとも理論的にはスレッドをコアにバインドする
可能性があります)。同じコア(X86、ARM)で(c)の他のスレッドと)前後に1つずつ...
タイトルが変だと思うかもしれませんので、説明させてください。多くの場合、競合状態について教えている人はx == 0
、スレッド 2 が既に認識しているのに、スレッド 1 は認識できると言っています。x=1;
私の質問は、同じコアでスケジュールされたスレッドに関するものです (非現実的ではありません。まだ 1 つのコアが組み込まれたシステムがあり、少なくとも理論的にはスレッドをコアにバインドする
可能性があります)。同じコア(X86、ARM)で(c)の他のスレッドと)前後に1つずつ...
それはまだ問題です。単一のコアで実行されるスレッドは、まったく非現実的ではありません。通常、何百ものスレッドが実行されていますが、ほとんどの場合、何百ものコアはありません。鳩の穴の定理により、これらのスレッドのうち少なくとも 2 つがコアを共有します。
スレッドが実際にはシーケンシャルではないため、競合状態が発生します。確かに順番に実行されますが、割り込みが発生し、予期せず CPU が他のスレッドに転送されます。これらの 2 つの (架空の) アセンブリ プログラムを想像してみてください。
Thread 1 Thread 2
A: Read R1, 0x0100 E: Read R2, 0x0100
B: Inc R1 F: Dec R2
C: Store R1, 0x0100 G: Store R2, 0x0100
このコードを順番に実行する場合、問題はありません。ただし、それらを中断することが許可されている場合、次のようなことが起こる可能性があります。
レジスターと address の値に何が起こるかを追跡0x0100
すると、終了値は 2 つのコードを順次実行した場合と同じではないことがわかります。
したがって、あなたの質問に対する答えは、スレッドが別々のコアで実行されているかのように、同じ CPU コアのプリエンプティブスレッドで競合が発生するということです。