7

開発環境とビルド環境を VS2008 から VS2012 にアップグレードして以来、volatile従来のコードベースでキーワードを使用することの意味について混乱しています (「古い」時代からスレッドを管理するための多くのコピー パターンがあるため、非常に広範囲です)。

Microsoft は、VS2012 のドキュメントに次のコメントを記載しています。

C# volatileキーワードに精通している場合、または以前のバージョンの Visual C++ でのvolatileの動作に精通している場合は、C++11 ISO 標準のvolatileキーワードが異なり、/volatile:isoコンパイラ オプションが指定されている場合に Visual Studio でサポートされることに注意してください。 . (ARM の場合、デフォルトで指定されています)。C++11 ISO 標準コードのvolatileキーワードは、ハードウェア アクセスにのみ使用されます。スレッド間通信には使用しないでください。std::atomic<T>スレッド間通信には、C++ 標準テンプレート ライブラリなどのメカニズムを使用します。

続けて次のように述べています。

/volatile:msコンパイラ オプションを使用すると (デフォルトでは ARM 以外のアーキテクチャがターゲットになっている場合)、コンパイラは、他のグローバル オブジェクトへの参照の順序を維持するだけでなく、揮発性オブジェクトへの参照間の順序を維持するための追加のコードを生成します。

これは、既存のコードが壊れることはありませんが、必ずしも移植可能であるとは限らない (私たちにとっては問題ではありません) という意味だと思います。

ただし、次のような疑問が生じます。可能であれば、アドバイスをお願いします。

  1. volatileMS からコードを移植しない場合でも、コード内の修飾子の使用を削除し、C++11 ISO 標準準拠の同等のものに置き換える必要がありますか?
  2. 上記を行わないと、何かデメリットはありますか?

これが実際には特定のプログラミングの問題ではないことを理解していますが、かなり大規模なリファクタリングに着手しており、この作業に関する賢明なガイドラインを提供できるようにしたいと考えています.

4

1 に答える 1