UNIX ライクな OS のシステム コールは再入可能です (つまり、複数のシステム コールを並行して実行できます)。C/C++11 の事前発生関係という意味で、これらのシステム コールの順序に関する制約はありますか?
たとえば、3 つのスレッド (疑似コード) を持つ次のプログラムを考えてみましょう。
// thread 1
store x 1
store y 2
// thread 2
store y 1
store x 2
// thread 3
Thread.join(1 and 2)
wait((load x) == 1 && (load y) == 1)
ここで、x
とy
が共有の場所であり、すべてのload
とstore
の順序が緩和されているとします。(注: アトミック アクセスが緩和されている場合、競合はバグとは見なされません。C/C++11 セマンティクスの意味では意図的store x 1
なものです。) このプログラムは終了する可能性があります。(1) コンパイラがandを並べ替えてからstore y 2
、(2) 実行する可能性があるためです。 store y 2
、store y 1
、store x 2
、そしてstore x 1
、(3) スレッド 3 はx = 1
とy = 1
を同時に読み取ることができます。
次のプログラムも終了する可能性があるかどうかを知りたいです。ここでは、いくつかのシステム コールsyscall1()
&syscall2()
がそれぞれスレッド 1 と 2 に挿入されています。
// thread 1
store x 1
syscall1()
store y 2
// thread 2
store y 1
syscall2()
store x 2
// thread 3
Thread.join(1 and 2)
wait((load x) == 1 && (load y) == 1)
プログラムを終了できないようです。ただし、呼び出されるシステム コールの順序の制約がない場合、このプログラムは終了する可能性があると思います。これが理由です。syscall1()
とはシリアルsyscall2()
化されておらず、並列で実行される可能性があるとします。syscall1()
その後、コンパイラは、 andのセマンティクスを完全に認識しているため、&と をsyscall2()
並べ替えることができます。store x 1
syscall1()
store y 2
そこで、異なるスレッドによって呼び出されるシステム コールの順序に関する制約があるかどうかを尋ねたいと思います。可能であれば、この種の質問の信頼できる情報源を知りたいです。