2012-02-21 60 views
1

我們有一個表示原子整數的包裝。在內部,它使用的是Windows' InterlockedIncrement()InterlockedDecrement()功能,這在volatile long變量來實現:易失性成員的訪問方法

class AtomicInt { 
public: 
    ... 

    operator long() const { return m_value; } 

private: 
    volatile long m_value; 
}; 

我的問題是,是查詢正確的電流值,上述運營商(即您始終獲得的電流值)或者我是否需要聲明該方法爲volatile以防止緩存值出現任何問題?

回答

2

你所做的一切都很好......你不需要將方法標記爲volatile。此外,由於您已經在類聲明中包含了該方法的定義,因此該方法通常會由編譯器隱式內聯,因此實際函數調用機制在編譯器優化過程中將被忽略。因此,在大多數情況下,變量本身可以直接訪問,而不需要中間函數調用,足以使變量聲明爲volatile

順便說一句,爲了將來的參考,請記住,在x86之外的多處理器環境中,volatile關鍵字不足以確保使用您的共享內存值的線程不接收緩存的數據。一般而言,volatile關鍵字只會阻止某些編譯器優化。在內存一致性規則較弱的處理器平臺(即ARM,PowerPC等)上,即使變量被標記爲易失性,您仍然可以從本地處理器內核訪問緩存值。解決這個問題的方法是實現適當的內存屏障,以確保實際處理器內存緩存中的任何陳舊值都被刷新並刷新。這些當然是依賴於平臺的指令......你的情況的好消息是你正在使用的編譯器內在函數將確保你不會遇到你的類AtomicInt這些問題,但我確實想讓你知道這個圍繞volatile關鍵字的一般問題。

+0

我認爲volatile在這裏帶有微軟的額外含義 – 2012-02-21 18:49:45

+0

是的,MSVC對'volatile'的解釋是我認爲增加了對'volatile'的實際含義和目的的混淆...... BTW,雖然它們增加了內存障礙安騰與'volatile',他們也會做同樣的WOA(Windows上的ARM)? – Jason 2012-02-21 19:41:21

+0

嗯,我不確定,但如果他們在某些平臺上使'volatile'變弱,我會感到驚訝。 – 2012-02-21 19:51:34

0

這足以令m_value不穩定。這足以阻止正在優化的訪問方法。