2016-04-26 105 views
1
//A count protected internally by a Mutex 
class AtomicCount 
{ 
public: 
    AtomicCount(); 
    ~AtomicCount(); 
    int value() const; 
    void increment(); 
private: 
    HANDLE hMutex; 
    int count; 
}; 

AtomicCount myCount; 
void loop_until_set() { 
    while(!myCount.value()) 
    Sleep(1000); 
} 

假設我們在一個線程中調用loop_until_set(),我們正在等待另一個線程執行myCount.increment()。有沒有危險,myCount.value()被優化,以至於當另一個線程調用myCount.increment()時,它永遠不會讀取更新的值?優化VS2010中的方法調用C++(多線程)

+0

沒有同步你有一個競爭條件。 – Thomas

+0

需要查看'value()'的代碼來回答這個問題。 – SergeyA

回答

0

使用前徹底調查volatile(您可能仍有競爭條件;有些人認爲使用volatile總是過於簡單的解決方案),但您絕對需要count成員。否則,這個簡單的場景將導致價值

inline void _sleep(int len) { for(int i=0;i<len;i++) { volatile int j=i; }; } 
#define Sleep(x) _sleep(x) 

這可能是做作)調用(以得到優化(在VC2010),但它揭示了在重新讀取的變量將是主要情況要求:當調用無法內聯的外部函數時,編譯器不知道myCount的內容可能發生了什麼,而執行很遠。