布尔变量的线程同步

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)

Mge*_*etz 7

答案很简单:使用std::atomic_bool这种方式,您不必担心违反内存模型和具有未定义的行为.bool不保证常规值在多线程条件下正确运行.然而,一个原子bool会正确地运行,因为如果该平台需要它,它可以保证同步,但这留给了实现.