由於將我們的開發和構建環境從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等架構目標,編譯器會產生額外的代碼,以保持在揮發對象的引用中的排序除了維護對其他全局對象的引用的順序外。
我認爲,我們現有的代碼不會中斷,但不一定是可移植的(對我們來說不是問題)。
但是,它提出這些問題,關於這一點我想一些建議,如果可能的話:
- 我們應該去掉的
volatile
預選賽應用在我們的我們的代碼,並與C++ 11符合ISO標準取代等價,即使我們不會將代碼移出MS? - 如果我們不這樣做,是否有任何缺點?
我明白,這不是一個真正的具體編程問題,但我們正在着手進行一些相當重大的重構,我希望能夠爲這項工作提供一些合理的指導。
請修復它。否則,你的一些同事會在他們一生中成爲我的同事,我不想教他們「即使你已經做了很多年了,也是線程安全的」。 – screwnut 2013-05-02 16:56:52
我會盡我所能 - 但「在他們的生活中晚些時候」我的大部分同事將與我一起退休;-) – 2013-05-02 19:00:57