2013-05-02 6 views
7

私たちの開発環境とビルド環境を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規格に準拠して置き換える必要があり

  1. はしかし、それは可能ならば、私は、いくつかのアドバイスをしたいと思いますれているこれらの質問に、提起しコードをMSから移植しないでください。

  2. 上記を行っていない場合、欠点はありますか?

これは実際には特定のプログラミング上の問題ではないことに感謝しますが、私たちはかなりのリファクタリングを開始しています。私はこの作業に賢明なガイドラインを提供したいと思います。

+1

修正してください。さもなければ、あなたの同僚のいくつかは、後で人生で私の同僚になり、 "あなたは何年もそれをやっていてもスレッドセーフです!"ということを教えたくありません。 – screwnut

+0

私は最善を尽くしますが、 "後で自分の人生で"私の同僚のほとんどは、私と一緒に引退されます;-) –

答えて

6
  1. 時間がある場合は、 C++ 11アトミクスは、必要な同期の種類を正確に制御し、より明確に定義されたセマンティクスを持ち、コンパイラがコードを最適化できるようにする可能性があります。
  2. 理論的には、非常にありそうもないことですが、コンパイラの将来のバージョンでは、MSスタイルの揮発性のサポートが完全になくなる可能性があります。それとも、ある日、あなたが実際にWindowsに留まっていても、MSコンパイラから移植することを望んでいます。リファクタリングを実行している場合は、揮発性物質をアトミックに置き換える作業を行う良い時期であり、将来あなたが作業をやめないようにします。
+0

感謝セバスチャン - 私たちは同じ行に沿って考えている、アトミックを使用するように「揮発性」ビットをリファクタリングすると私たちはマルチスレッドコードをより一般的に見直す傾向があるので、私は「停止する良い場所」を探していて、それを見ているのが困っています。 +1のアドバイス。 –

関連する問題