什么是C ++ 11启动异步任务并忘掉它的方法?

时间:2014-05-04 09:49:38

标签: c++ multithreading c++11

我需要这样的东西:

void launch_task()
{
    std::thread([](){ run_async_task(); });
}

除了线程的析构函数将终止我的任务。我不需要对任务进行任何控制,也不需要返回值。它必须运行它,然后线程应该终止并且应该处理C ++线程对象。我需要什么C ++ 11工具?

我查看了std::async,但无法找到我案例的使用示例。它似乎是一个非常复杂的系统,我需要以某种方式存储和操纵std::future或它变得同步(如果我的理解是正确的;我没有找到一个好的关于std::async)的明确文章。

2 个答案:

答案 0 :(得分:33)

创建后立即分离。

std::thread([](){ run_async_task(); }).detach();

分离后,线程将不再可连接,因此~thread()将无效。 This answer讨论了此行为的更多细节。

如W.B.所述。在下面,std::async将无法正常工作,原因如下reference

  

如果从std :: async获取的std :: future具有临时对象   生命周期(不移动或绑定到变量),析构函数   std :: future将在完整表达式结束时阻塞,直到   异步操作完成

答案 1 :(得分:1)

恢复旧线程,但是有一个巧妙的技巧*,尽管返回了阻塞的std::async,但是如何通过使用std::future来实现“即发即弃”功能。主要成分是指向返回的std::future的共享指针,该指针按值在lambda中捕获,从而导致其引用计数器增加。这样,std::future的析构函数将不会被调用,直到lambda完成其工作,并根据需要提供真正的异步行为。

template <class F>
void call_async(F&& fun) {
    auto futptr = std::make_shared<std::future<void>>();
    *futptr = std::async(std::launch::async, [futptr, fun]() {
        fun();
    });
}

*对我的一位真正的C ++专家MVV的同事表示敬意,他向我展示了这个技巧。