私たちの開発環境とビルド環境をVS2008からVS2012にアップグレードして以来、従来のコードベースではvolatile
キーワードを使用することの意味が混乱しています「古い」日のスレッドを管理するためのコピーされたパターン)。VS2012で 'volatile'キーワードを使用するベストプラクティス
MicrosoftがVS2012ドキュメントの以下の発言を持っている:
あなたがC#揮発性キーワード、またはVisual C++の以前のバージョンで揮発性の行動に精通に精通している場合は、注意してください
/volatile:iso
コンパイラオプションが指定されている場合は、C++ 11 ISO標準volatileキーワードが異なり、Visual Studioでサポートされていることを確認してください。 (ARMでは、デフォルトで指定されています)。 volatileキーワード(C++ 11)ISO標準コードはハードウェアアクセス専用です。スレッド間通信には使用しないでください。スレッド間通信の場合は、C++標準テンプレートライブラリのstd::atomic<T>
などのメカニズムを使用します。
それは言うように行く:
/volatile:ms
コンパイラオプションを使用-でされている場合、デフォルトARM以外のアーキテクチャをターゲット-されている場合、コンパイラは揮発性のオブジェクトへの参照間の順序を維持するために余分なコードを生成し、他のグローバルオブジェクトへの参照への順序付けの維持に加えて。
これは私たちの既存のコードが壊れませんが、必ずしも移植可能ではないことを意味します(私たちの問題ではありません)。我々は我々のコードでvolatile
修飾子の使用を削除し、C++ 11 ISO規格に準拠して置き換える必要があり
- :
はしかし、それは可能ならば、私は、いくつかのアドバイスをしたいと思いますれているこれらの質問に、提起しコードをMSから移植しないでください。
- 上記を行っていない場合、欠点はありますか?
これは実際には特定のプログラミング上の問題ではないことに感謝しますが、私たちはかなりのリファクタリングを開始しています。私はこの作業に賢明なガイドラインを提供したいと思います。
修正してください。さもなければ、あなたの同僚のいくつかは、後で人生で私の同僚になり、 "あなたは何年もそれをやっていてもスレッドセーフです!"ということを教えたくありません。 – screwnut
私は最善を尽くしますが、 "後で自分の人生で"私の同僚のほとんどは、私と一緒に引退されます;-) –