2016-04-26 107 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的内容可能发生了什么,而执行很远。