在我的类A
中,有一个线程在对象生存期内一直运行。现在,我有一个 bool 成员变量,每个循环都会检查一次,在析构函数中,此变量设置为false。
class A {
public:
A() : mRun(true) {
mThread = std::thread(&A::DoWork(), this);
}
~A() {
mRun = false;
}
private:
bool mRun;
std::thread mThread;
void DoWork() {
while (mRun) {
...
}
}
};
是否可以安全地使用
while(true)
?我读到关于线程破坏的消息,它们将被终止。 最佳答案
是的(假设while(true)
实际上是while (mRun)
)。您需要确保该mRun
成员安全,以便从不同线程进行并发读/写访问。最简单的方法是使用 std::atomic<>
值,如下所示:
class A {
public:
A() : mRun(true) {
mThread = std::thread(&A::DoWork(), this);
}
~A() {
mRun = false; // <<<< Signal the thread loop to stop
mThread.join(); // <<<< Wait for that thread to end
}
private:
std::atomic<bool> mRun; // Use a race condition safe data
// criterium to end that thread loop
std::thread mThread;
void DoWork() {
while (mRun == true) {
...
}
}
};
mRun == true
应该回退到 std::atomic::operator T()
函数。