struct Test {
bool active{true};
void threadedUpdate() {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
if(!active) // crashes here after Test instance is destroyed
return;
}
Test() {
std::thread([this]{ while(true) threadedUpdate(); }).detach();
}
~Test() {
// somehow stop the detached thread?
}
};
当一个实例Test
被初始化时,它会产生并分离一个std::thread
在后台运行的实例。当同一个实例被销毁时,前面提到的线程会尝试访问active
与实例一起被销毁的成员,从而导致崩溃(以及AddressSanitizer回溯)。
有没有办法停止分离的线程~Test()
?
设计很糟糕。在调用者被销毁之前在后台运行的线程应该如何正确生成/处理?