使用异步射击线程并超出其未来的范围是否安全?

时间:2016-07-01 23:31:53

标签: c++ multithreading

我有一个需要立即完成工作的功能(重新分配),然后是一些后台工作(移动旧数据),我可以这样做吗?

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

似乎工作正常,但我很怀疑,因为它不会让我正常使用std :: async而没有东西来保存返回值并尝试在同一个线程上执行任务。< / p>

1 个答案:

答案 0 :(得分:2)

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

这意味着是的,如果你不返回结果,它将同步行为;对std::async的调用将返回一个临时的,它将立即调用它的析构函数并阻塞直到工作完成。同样,如果将它绑定到一个值,它将继续工作,但一旦绑定值到达其范围的末尾就暂停。

例如:

{
    // 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