在VS2010 c ++中优化远程方法调用(多线程)

时间:2016-04-26 19:25:01

标签: c++ multithreading visual-studio-2010

//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()时无法读取更新值的方式进行优化的危险?

1 个答案:

答案 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的内容可能发生了什么。