线程成员相对于原子 bool 成员的排序

Ordering of thread member relative to atomic bool member

在此简化的代码中,SO m_threadFoo 的第一个成员,m_ready 是第二个成员。这是否意味着 m_thread 可以看到 m_ready 的未初始化值,或者线程会在设置其他成员后启动(在 m_ready 设置为 false 之后)?

#include <atomic>
#include <thread>
#include <unistd.h>

struct Foo final {
    std::thread       m_thread;
    std::atomic<bool> m_ready;

    Foo() :
        m_thread([this]() {
            while (!m_ready)
                usleep(1000);
            // Do work on other things only safe to touch after ready is true
        }),
        m_ready(false)
    {}

    ~Foo() { m_thread.join(); }

    void setReady() { m_ready = true; }
};

int main() {
    Foo foo;
    // Initialize other things
    foo.setReady();
    return 0;
}

Class 个数据成员是 initialized in the order they appear in the class definitionm_readym_thread 之后声明,因此它在 m_thread.

之后构造

您的 m_thread constructor 启动了一个执行线程,给定的函数将立即启动。

读取 m_ready 的线程与构造 m_ready 的构造函数之间存在竞争。在 class 定义中将 m_ready 放在 m_thread 之前。