如何完成std :: async

时间:2018-01-21 11:48:13

标签: c++

以下是一个示例代码:

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;
};

我应该以某种方式在析构函数中完成未来或上面的代码是否正常?

1 个答案:

答案 0 :(得分:0)

您展示的代码不合适,但不是您可能认为的原因。由于task引用的共享状态是由std::async创建的,因此std::future的转义将在销毁task时阻止。但那仍然无法帮助你。

问题是类的成员以与其初始化相反的顺序被销毁。由于work最后被初始化,因此它将在 task之前被销毁。因此,即使您将其设置为false,您的任务实际上可能是在循环中运行检查时引用死对象。所以你手上会有未定义的行为。

您可以在work之前移动task来解决此问题,因此其生命周期会更长。或者您可以在task.wait()的析构函数中明确调用T。就个人而言,我认为后者更清楚。