2013-05-02 31 views
7

由於將我們的開發和構建環境從VS2008升級到VS2012,我對我們遺留代碼庫中使用volatile關鍵字的影響感到困惑(這是相當廣泛的,因爲存在很多複製模式以管理「舊」時代的線程)。在VS2012中使用'volatile'關鍵字的最佳做法

微軟有VS2012文檔中的以下言論:

如果你熟悉C#揮發性關鍵字或熟悉的揮發性在早期版本的Visual C++的行爲,做到心中有數C++ 11 ISO標準易失性關鍵字是不同的,並且在指定/volatile:iso編譯器選項時在Visual Studio中受支持。 (對於ARM,它是默認指定的)。 C++ 11 ISO標準代碼中的易失性關鍵字僅用於硬件訪問;請勿將其用於線程間通信。對於線程間通信,請使用C++標準模板庫中的機制,如std::atomic<T>

它接着說:

/volatile:ms編譯器選項使用,默認情況下,當比ARM等架構目標,編譯器會產生額外的代碼,以保持在揮發對象的引用中的排序除了維護對其他全局對象的引用的順序外。

我認爲,我們現有的代碼不會中斷,但不一定是可移植的(對我們來說不是問題)。

但是,它提出這些問題,關於這一點我想一些建議,如果可能的話:

  1. 我們應該去掉的volatile預選賽應用在我們的我們的代碼,並與C++ 11符合ISO標準取代等價,即使我們不會將代碼移出MS?
  2. 如果我們不這樣做,是否有任何缺點?

我明白,這不是一個真正的具體編程問題,但我們正在着手進行一些相當重大的重構,我希望能夠爲這項工作提供一些合理的指導。

+1

請修復它。否則,你的一些同事會在他們一生中成爲我的同事,我不想教他們「即使你已經做了很多年了,也是線程安全的」。 – screwnut 2013-05-02 16:56:52

+0

我會盡我所能 - 但「在他們的生活中晚些時候」我的大部分同事將與我一起退休;-) – 2013-05-02 19:00:57

回答

6
  1. 如果您有時間了。好處並不是那麼好 - C++ 11 atomics可以更準確地控制你所需要的同步類型,並且有更清楚定義的語義,這可以使編譯器更好地優化代碼。
  2. 理論上,但是非常不可能,未來版本的編譯器可能會完全放棄對MS風格volatile的支持。或者有一天你實際上想離開MS編譯器,即使你留在Windows上。如果你現在正在進行重構,那麼可能是用原子替換揮發物的工作的好時機,從而使你在將來不再做這項工作。
+0

謝謝塞巴斯蒂安 - 我們在思考同樣的問題,這很好,因爲重構'volatile'位來使用原子將會導致我更普遍地檢查我們的多線程代碼,所以我正在尋找「停下來的好地方」,並且無法看到它! +1的建議。 – 2013-05-02 15:00:11