最近遇到一个关于线程和销毁的问题。
这是一个示例,我使用 Visual Studio 2019 在 Windows 10 上运行我的代码:
class A
{
public:
A() { num = 100; }
~A() {}
int getNum() { return num; }
private:
int num;
};
class B
{
public:
B() { a = new A(); }
~B() { delete a; }
void start()
{
std::thread t(std::mem_fn(&B::func), std::ref(*this));
t.detach();
}
void func()
{
while (flag)
{
std::cout << a->getNum() << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
}
}
void stop()
{
flag = false;
}
private:
A* a;
bool flag = true;
};
int main()
{
B* b = new B();
b->start();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
b->stop();
delete b;
while (true)
{
// other codes
}
}
这里我调用了 b->stop()
,flag
设置为 false。然后我delete B
,所以成员a
被删除。但是,由于 std::this_thread::sleep_for(2000)
函数,线程 t
不会停止。然后它会出现错误。
我尝试添加睡眠标志:
void func()
{
while (flag)
{
std::cout << a->getNum() << std::endl;
sleepFlag = true;
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
sleepFlag = false;
}
}
void stop()
{
flag = false;
while (sleepFlag)
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
它有效。 delete b
将等待 b->stop()
完成。所以线程会在 delete a
之前停止。但是如果我有 10 个 B
的指针,也许我会等待 20 秒!那不是我想要的。
如何停止线程 t
并正确销毁对象 b
?