我需要这样的东西:
void launch_task()
{
std::thread([](){ run_async_task(); });
}
除了线程的析构函数将终止我的任务。我不需要对任务进行任何控制,也不需要返回值。它必须运行它,然后线程应该终止并且应该处理C ++线程对象。我需要什么C ++ 11工具?
我查看了std::async
,但无法找到我案例的使用示例。它似乎是一个非常复杂的系统,我需要以某种方式存储和操纵std::future
或它变得同步(如果我的理解是正确的;我没有找到一个好的关于std::async
)的明确文章。
答案 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的同事表示敬意,他向我展示了这个技巧。