3

このマルチスレッド C++ プログラムを作成していて、リリースvolatileモードでコンパイルすると、ある種のバグ (オブジェクトがまだ null) が見つかりました。つまり、マーカーが見つからないように見えます。

しかし問題は、すべての種類のオブジェクトに触れる 2 番目のワーカー スレッドがあるため、事実上すべてがプログラム内で揮発性であることを意味します。

キーワードが修正するように特別に設計されたバグを作成するApple LLVM コンパイラの最適化をオフにする方法があるかどうか疑問に思っています。volatileこれらのバグはデバッグ モードでは表示されません (最適化がオフになっているため)。基本volatile的にどこにでも配置するということは、すべてのメンバー関数の後にすべてのクラスを追加volatile、すべての共有変数宣言の前に追加することを意味します。volatile

volatile何かをマークするのを忘れたために偽のバグが表示される危険を冒すよりも、その最適化を失うほうがよいと思いますvolatile

4

1 に答える 1

7

C++ では、volatileスレッド セーフとは関係ありません。データ競合を回避するためにそれに頼ることはできません. その目的は、(単一のスレッド、または他のメカニズムを使用して相互に同期するスレッドからの) 変数への同期アクセスを、指定された順序で正確に発生させることです。これは、ハードウェアとやり取りするときに、何もしていないように見えても実際にはハードウェアの状態に影響を与えるアクセスが最適化されないようにするために必要になることがよくあります。非同期アクセスの影響については保証されません。

データ競合を回避するには、アトミック操作または明示的なロックを使用して、共有オブジェクトへのアクセスを同期する必要があります。C++11 はこれらを標準ライブラリで提供します。過去に行き詰まっている場合は、プラットフォームで利用可能なライブラリ ( pthreadsなど) または言語拡張機能 (アトミック組み込み関数など) に依存する必要があります。

于 2013-08-16T15:24:51.517 に答える