优化VS2010中的方法调用C++(多线程)
问题描述:
//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++(多线程)
答
使用前彻底调查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的内容可能发生了什么,而执行很远。
没有同步你有一个竞争条件。 – Thomas
需要查看'value()'的代码来回答这个问题。 – SergeyA