//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()时无法读取更新值的方式进行优化的危险?
答案 0 :(得分:0)
在使用volatile
之前彻底调查(你可能仍然有竞争条件;有些人认为使用volatile总是一个过于简单的解决方案),但你绝对需要count
成员。否则,这个简单的场景将导致调用value()以进行优化(在vc2010中)
inline void _sleep(int len) { for(int i=0;i<len;i++) { volatile int j=i; }; }
#define Sleep(x) _sleep(x)
这可能是设计的,但它揭示了需要重新读取变量的主要情况:当调用无法内联的外部函数时,编译器不会这样做。知道在执行很远的时候myCount的内容可能发生了什么。