0

C の非揮発性変数に関して、コンパイラにどのような制限があるかを理解したいと思います。

本当かどうかはわかりませんが、次のコードがある場合はそう言われました。

int x;
...
void update_x() {
  lock();
  x = x*5+3;
  unlock();
} 

x*5 のような中間計算を x に格納することは技術的に合法であり、そのため、読み取りが中間値を読み取る可能性があるため、x を読み取るためにロックを取得する必要があります。私の最初の質問は、本当にそうなのかということです。そうでない場合、なぜですか?

そうであれば、フォローアップの質問があります。コンパイラが x をロックする前または後に一時的なストレージとして使用することを妨げるものはありますか? (コンパイラが、プログラムを実行している単一のスレッドがそれに気付かないことを証明できると仮定します)。

そうでない場合、すべてのアクセスがロックによって保護されていても、不揮発性の共有変数を持つプログラムは技術的に未定義であることを意味しますか?

ありがとう、イリヤ

4

1 に答える 1