我有一个需要先完成一些工作(重新分配)然后再进行一些后台工作(移动旧数据)的函数,我可以这样做吗?

auto fof = std::async(std::launch::async, &cont2::move_data, this, old_data, old_size);

似乎工作正常,但我很怀疑,因为它不会让我正常使用std::async而不用保存返回值,而是尝试在同一线程上执行任务。

最佳答案

如果返回值std::future超出范围,则其析构函数将停止线程的执行,直到异步操作完成。

就是说,是的,如果不返回结果,它将同步运行。调用std::async将返回一个临时文件,该临时文件将立即调用它的析构函数,并阻塞直到工作完成。同样,如果将其绑定(bind)到一个值,它将继续工作,但是一旦绑定(bind)的值到达其作用域的末尾就会暂停。

例如:

{
    // bind to a value
    auto fof = std::async(std::launch_async,
                          &cont2::move_data, this, old_data, old_size);
    // do work
} // at this point, execution will halt until cont2::move_data finishes

参见http://en.cppreference.com/w/cpp/thread/async

09-10 05:22
查看更多