見た後、束 の 他の 質問 と その 回答を、私はという印象を得るCで「揮発性」というキーワードが正確に何を意味するのかには広範な合意はありませんが。
標準自体でさえ、誰もがそれが何を意味するのかについて合意するのに十分明確ではないようです。
他の問題の中で:
- それはあなたのハードウェアとあなたのコンパイラに依存して異なる保証を提供するようです。
- コンパイラの最適化には影響しますが、ハードウェアの最適化には影響しません。そのため、独自のランタイム最適化を行う高度なプロセッサでは、コンパイラが防止したい最適化を防止できるかどうかさえ明確ではありません。(一部のコンパイラーは、一部のシステムで一部のハードウェア最適化を防止するために命令を生成しますが、これは決して標準化されていないようです。)
問題を要約すると、「大量に読み取った後」「揮発性」が次のようなことを保証しているように見えます。値は、レジスタからだけでなく、少なくともコアのL1キャッシュにも、同じ順序で読み書きされます。読み取り/書き込みがコードに表示されます。しかし、これは役に立たないようです。レジスタからの読み取り/レジスタへの書き込みは同じスレッド内ですでに十分ですが、L1キャッシュとの調整は、他のスレッドとの調整に関してそれ以上何も保証しません。L1キャッシュとだけ同期することがいつ重要になるかは想像できません。
USE 1
揮発性の広く合意された使用は、ライトを(直接、ハードウェアで)制御するメモリ内のビットのように、特定のメモリ位置がI / O機能にハードウェアでマッピングされている古いシステムまたは組み込みシステムであるようです、またはキーボードのキーが押されているかどうかを通知するメモリ内のビット(ハードウェアによって直接キーに接続されているため)。
と思われる「利用1」とは、そのターゲットのマルチコアシステムを含んポータブルなコードでは発生しません。
USE 2
「use 1」とそれほど変わらないのは、割り込みハンドラー(ライトの制御やキーからの情報の保存など)によっていつでも読み書きできるメモリです。しかし、すでにこのため、システムによっては、割り込みハンドラが 独自のメモリキャッシュを備えた別のコアで実行される可能性があり、「揮発性」はすべてのシステムでキャッシュの一貫性を保証しないという問題があります。
したがって、「use 2」は「volatile」が提供できる範囲を超えているようです。
USE 3
他に議論の余地のない唯一の用途は、コンパイラーが認識しない同じメモリーを指している同じメモリーを指すさまざまな変数を介したアクセスの誤最適化を防ぐことです。しかし、人々がそれについて話していないので、これはおそらく議論の余地がないだけです-私はそれについての言及を1つだけ見ました。また、C標準では、「異なる」ポインター(関数への異なる引数など)が同じ項目または近くの項目を指す可能性があることをすでに認識しており、コンパイラーがそのような場合でも機能するコードを生成する必要があることをすでに指定しています。しかし、私はこのトピックを最新(500ページ)の標準ですぐに見つけることができませんでした。
では「use 3」はまったく存在しないのでしょうか。
したがって、私の質問:
「揮発性」は、マルチコアシステムのポータブルCコードで何かを保証しますか?
編集-更新
最新の標準を参照した後、答えは少なくとも非常に制限されているように見えます:
1.標準は、特定のタイプ "volatile sig_atomic_t"の特別な扱いを繰り返し指定しています。ただし、この規格では、マルチスレッドプログラムでシグナル関数を使用すると、未定義の動作が発生することも規定されています。したがって、この使用例は、シングルスレッドプログラムとそのシグナルハンドラ間の通信に限定されているようです。
2.この規格では、setjmp / longjmpに関連する「揮発性」の明確な意味も規定されています。(重要なコードの例は、他の質問と回答に記載されています。)
したがって、より正確な質問は次のようになります
。「揮発性」は、(1)シングルスレッドプログラムがシグナルハンドラから情報を受信できるようにする、または(2)setjmpを許可することを除いて、マルチコアシステムのポータブルCコードで何でも保証しますかsetjmpとlongjmpの間で変更された変数を表示するコード?
これははい/いいえの質問です。
「はい」の場合、「揮発性」が省略された場合にバグになるバグのないポータブルコードの例を示すことができればすばらしいでしょう。「いいえ」の場合、マルチコアターゲットの場合、これら2つの非常に特殊なケース以外では、コンパイラーは「揮発性」を無視してもかまいません。
volatile
具体的には、それが必要だと私は信じています。
volatile
、プログラムが非同期に変更される可能性があることをプログラムに通知する必要があります。