我正在做这样的事情:
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
更改。我还需要其他同步吗?回调只读取,但从不写该字符串。
答案 0 :(得分:3)
在一个线程中写入值并访问另一个线程中的值时,您需要进行适当的同步。如果没有在两个线程中进行适当的同步,那么您将进任何数据争用都会导致程序出现未定义的行为。