C 11 の Volatile 変数
C 11 標準でのマルチスレッド マシン モデルの導入により、volatile 変数の動作に関する疑問が生じます変数は、同時実行環境で未定義の動作を引き起こす可能性のある最適化を防ぐために伝統的に使用されてきました。
C 98/03 では、メモリ モデルでのマルチスレッドの認識の欠如は、コンパイラが最適化できることを意味していました。揮発性変数の読み取りが完了すると、変数の値が変更されるのを待つ無限の while ループという悪名高い例につながります。
しかし、C 11 メモリ モデルは、変数への同時アクセスの可能性を認めています。これは、volatile が非推奨になったという意味ですか?
コンパイラーの最適化と未定義の動作
答えは、C 11 メモリー モデルの微妙な性質にあります。マルチスレッドは認識されますが、適切な同期なしで変数にアクセスする場合に未定義の動作が発生する可能性が排除されるわけではありません。マルチスレッド環境でも、共有変数への非アトミック アクセスは未定義のままです。
volatile int x;
void func() {
x = 0;
while (x = = 0) {}
}
したがって、コード例では、コンパイラーは while ループでの x の読み取りを自由に最適化することができ、その結果、未定義の動作が発生します。 Volatile はメモリ アクセスにのみ影響し、スレッド動作には影響しません。
メモリ バリアとスレッドの整合性
スレッドの整合性には、あるスレッドから別のスレッドへの書き込みの可視性を確保するための適切な同期メカニズムが必要です。 。 C 11 メモリ モデルは、書き込みが他のスレッドにいつどのように表示されるかを具体的に定義します。 volatile はこの要件に対応しません。
volatile は、コンパイラーが変数からのメモリー読み取りを最適化できないことを保証しますが、スレッドの可視性については保証しません。ロックやアトミック操作などの同期構造によって発行されるメモリ バリアは、コア間で書き込みが確実に同期されるようにするために必要です。
結論
C 11 では、volatile が引き続き関連します。不正なメモリアクセスにつながる可能性のある最適化を防止します。ただし、マルチスレッド プログラミングには十分ではありません。スレッドの整合性と同時環境での定義された動作を保証するには、適切な同期メカニズムが依然として必要です。
以上が「volatile」は依然として C 11 マルチスレッドに関連していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。