我正在做这样的事情:

struct MyClass::Impl {
   std::string someString;

   //Invoked from thread "anotherThread"
   void callback() {
      std::cout << someString << std::endl;
   }
};


void MyClass::DoSomething() {
   //Connnect callback and fire operation in another thread
   anotherThread.Start();

   anotherThread.Op1();

   //Wait to finish without joining, Op1 invokes callback from another thread
   //...

   //string written in main thread
   impl->someString = someOtherString;

   anotherThread.Op2();
   //Wait to finish without joining, Op2 invokes callback from anotherThread
}


问题是,即使已写入impl->someString回调,我也看不到它。我是否需要任何其他同步?回调仅读取,但不写入该字符串。

最佳答案

在一个线程中写入值并在另一个线程中访问值时,您需要进行适当的同步。如果两个线程之间没有正确同步,则将导致数据争用。任何数据争用都会导致您的程序具有未定义的行为。

08-27 07:15