posix標準は、ミューテックスのようなものがメモリ同期を強制すると言っています。ただし、コンパイラはメモリ アクセスの順序を変更する場合があります。私たちが持っていると言う
lock(mutex);
setdata(0);
ready = 1;
unlock(mutex);
コンパイラの並べ替えで以下のコードに変更される可能性がありますよね?
ready = 1;
lock(mutex);
setdata(0);
unlock(mutex);
では、ミューテックスはどのようにしてメモリアクセスを同期できるのでしょうか? より正確に言えば、コンパイラは、ロック/ロック解除をまたいで並べ替えを行うべきではないことをどのように認識していますか?
ここでは実際にシングル スレッドの側面について説明します。ready は関数呼び出し lock(mutex) で使用されないため、ready 割り当ての並べ替えは完全に安全です。
EDITED:関数呼び出しがコンパイラが通過できないものである場合、それをコンパイラのメモリバリアと見なすことができます
asm volatile("" ::: "memory")