「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 「volatile」は依然として C++11 マルチスレッドに関連していますか?

「volatile」は依然として C++11 マルチスレッドに関連していますか?

2024 年 11 月 16 日に公開
ブラウズ:578

Is `volatile` Still Relevant in C  11 Multithreading?

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) {}
}

したがって、このコード例では、コンパイラーは依然として x の読み取りを自由に最適化できます。 while ループ内で発生し、未定義の動作が発生します。 Volatile はメモリ アクセスにのみ影響し、スレッド動作には影響しません。

メモリ バリアとスレッドの整合性

スレッドの整合性には、あるスレッドから別のスレッドへの書き込みの可視性を確保するための適切な同期メカニズムが必要です。 。 C 11 メモリ モデルは、書き込みが他のスレッドにいつどのように表示されるかを具体的に定義します。 volatile は、この要件には対応しません。

volatile は、コンパイラーが変数からのメモリー読み取りを最適化できないことを保証しますが、スレッドの可視性については保証しません。ロックやアトミック操作などの同期構造によって発行されるメモリ バリアは、コア間で書き込みが確実に同期されるようにするために必要です。

結論

C 11 では、volatile が引き続き関連します。不正なメモリアクセスにつながる可能性のある最適化を防止します。ただし、マルチスレッド プログラミングには十分ではありません。スレッドの整合性と同時環境での定義された動作を保証するには、適切な同期メカニズムが依然として必要です。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3