线程成员相对于原子 bool 成员的排序
Ordering of thread member relative to atomic bool member
在此简化的代码中,SO m_thread
是 Foo
的第一个成员,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 definition。 m_ready
在 m_thread
之后声明,因此它在 m_thread
.
之后构造
您的 m_thread
constructor 启动了一个执行线程,给定的函数将立即启动。
读取 m_ready
的线程与构造 m_ready
的构造函数之间存在竞争。在 class 定义中将 m_ready
放在 m_thread
之前。
在此简化的代码中,SO m_thread
是 Foo
的第一个成员,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 definition。 m_ready
在 m_thread
之后声明,因此它在 m_thread
.
您的 m_thread
constructor 启动了一个执行线程,给定的函数将立即启动。
读取 m_ready
的线程与构造 m_ready
的构造函数之间存在竞争。在 class 定义中将 m_ready
放在 m_thread
之前。