C 11 標準では、マシン モデルに大幅な変更が導入され、シングル スレッドからマルチ スレッドに移行しました。スレッドアプローチ。これにより、疑問が生じます。この変更により、while ループ内で読み取られた静的変数が最適化されてしまう、悪名高い「読み取り最適化」問題の可能性が排除されるのでしょうか?
マルチスレッド環境では、変数への同時アクセスの可能性を考慮することが重要です。 C では、キーワード volatile を使用して、変数を最適化して取り除くことができないことをコンパイラーに通知できます。これにより、コンパイラが変数の値が変更されないと想定する場合でも、変数が常にメモリから読み取られるようになります。
古典的な例の場合、 static int x; void func() { x = 0; while (x == 0) {} } の場合、オプティマイザは x がループ全体を通じて 0 のままであると想定し、ループを完全に削除する場合があります。ただし、別のスレッドが x を同時に変更すると、ループは終了せず、予測できない動作が発生します。
一方、C 11 メモリ モデルは、次の可能性を認識しています。変数への同時アクセスでは、アトミックな操作は必須ではありません。変数への非アトミック アクセスは、未定義の動作を構成します。
これは、C 11 であっても、volatile を使用してもスレッド セーフの根本的な問題に対処できないことを意味します。メモリ モデルでは、スレッド間の明示的な順序付けと可視性を確立するために、ミューテックスやアトミック操作などの特定の同期メカニズムが必要です。
Volatile は別の目的を果たします。これにより、コンパイラによるメモリ読み取りの最適化が防止され、常に最新の値がメモリからフェッチされるようになります。ただし、スレッド間のデータ整合性を確保するという問題には対処していません。
以上がVolatile は C 11 のマルチスレッドの世界にまだ関係していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。