sch*_*eda 2 c++ multithreading
可以说我在一个类中有2个Thread方法A.其中一个线程一直在运行,并且正在检查是否设置了成员变量.如果此成员变量设置为true,则应启动另一个线程.第二个线程mThread2通过检查变量来自行停止mRunThread2.
现在的问题是:是否需要对布尔变量进行互斥?写入变量需要多个汇编指令,所以在这一点上我需要同步.
class A {
public:
A() : mRunThread1(true) {
mThread1 = std::thread(&A::DoWork1(), this);
}
~A() {
mRunThread1 = false;
}
void Start2() { mRunThread2 = true; }
void Stop2() { mRunThread2 = false; }
private:
bool mRunThread1;
bool mRunThread2;
std::thread mThread1;
std::thread mThread2;
void DoWork1() {
while (mRunThread1) {
bool lastState = false;
if (mRunThread2 && !lastState) {
if (mThread2.joinable()) mThread2.join();
mThread2 = std::thread(&A::DoWork2(), this);
}
lastState = mRunThread2;
}
}
void DoWork2() {
while (mRunThread2) {
:::
}
}
};
Run Code Online (Sandbox Code Playgroud)
答案很简单:使用std::atomic_bool这种方式,您不必担心违反内存模型和具有未定义的行为.bool不保证常规值在多线程条件下正确运行.然而,一个原子bool会正确地运行,因为如果该平台需要它,它可以保证同步,但这留给了实现.