以下是一个示例代码:
struct T
{
T()
{
task = std::async(std::launch::async, [this]()
{
while(work)
{
//do something
}
});
}
~T()
{
work = false;
}
std::future<void> task;
std::atomic_bool work;
};
我应该以某种方式在析构函数中完成未来或上面的代码是否正常?
答案 0 :(得分:0)
您展示的代码不合适,但不是您可能认为的原因。由于task
引用的共享状态是由std::async
创建的,因此std::future
的转义将在销毁task
时阻止。但那仍然无法帮助你。
问题是类的成员以与其初始化相反的顺序被销毁。由于work
最后被初始化,因此它将在 task
之前被销毁。因此,即使您将其设置为false
,您的任务实际上可能是在循环中运行检查时引用死对象。所以你手上会有未定义的行为。
您可以在work
之前移动task
来解决此问题,因此其生命周期会更长。或者您可以在task.wait()
的析构函数中明确调用T
。就个人而言,我认为后者更清楚。