マルチスレッド プログラミングにおける Volatile の固有の制限
マルチスレッド プログラミングの領域では、共有データへの同期アクセスが重要です。 1 つのアプローチには、変数の値を確実に保持するために volatile キーワードを利用することが含まれます。しかし、最近の議論により、そのようなコンテキストにおける volatile の有効性に関する懸念が生じています。
Volatile とは何ですか?
Volatile は、最適化すべきではない変数を宣言します。プログラム。これにより、コンパイラは値をレジスタにキャッシュせず、アクセスされるたびにメモリからフェッチするようになります。当初はハードウェア レジスタまたは I/O 操作で使用することを目的としていましたが、マルチスレッド プログラミングの状況でよく使用されてきました。
マルチスレッドにおける Volatile の課題
残念ながら、 volatile は、マルチスレッドのコンテキストで使用する場合には制限があります。揮発性変数への読み取りと書き込みが即座に、他の揮発性アクセスと比較して正しい順序で行われることが保証されますが、揮発性メモリ アクセスを中心とした不揮発性メモリ アクセスの並べ替えは妨げられません。
グローバル変数 foo を考えてみましょう。揮発性として宣言され、複数のスレッドによって共有されます。 1 つのスレッドが foo をアトミックに設定し、別のスレッドがそれを読み取ります。 volatile 宣言により、書き込み操作と読み取り操作が最適化されないことが保証されます。ただし、コンパイラは、不揮発性変数のロードなど、他のメモリ操作を揮発性操作と比較して並べ替える可能性があります。
解決策: メモリ バリアとアトミック変数
並べ替えを防ぐには、メモリバリアが必要です。これらは、バリアを越えてメモリ アクセスが並べ替えられないようにコンパイラと CPU に指示します。揮発性変数への書き込み後にメモリ バリアを配置すると、揮発性書き込みに対する後続の不揮発性読み取りの並べ替えが防止されます。
ただし、メモリ バリアは保留中のすべての読み取りと書き込みが実行されることも保証するため、基本的にはvolatile と同じ機能を提供します。したがって、メモリ バリアを使用する場合、 volatile キーワードは不要になります。
C の最新の代替手段: アトミック変数
C 11 では、アトミック変数 (std::atomic 以上がVolatile は本当にマルチスレッド同期の問題を解決しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。