如何完成标准::异步

How to finalize std::async

本文关键字:异步 标准 何完成      更新时间:2023-10-16

下面是一个示例代码:

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

我应该以某种方式在析构函数中完成 future 还是上面的代码可以

你显示的代码不行,但不是出于你认为的原因。由于task所指的共享状态是由std::async创建的,std::future的d'tor在摧毁task时会阻塞。但这仍然对你没有帮助。

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

您可以通过在task之前移动work来解决它,因此它的寿命更长。或者,您可以在 T 的析构函数中显式调用 task.wait()。我个人认为后者更清楚。