Vio*_*ffe 28 c++ multithreading c++11
我需要这样的东西:
void launch_task()
{
std::thread([](){ run_async_task(); });
}
Run Code Online (Sandbox Code Playgroud)
除了线程的析构函数将终止我的任务.我不需要对任务进行任何控制,也不需要返回值.它必须运行它,然后线程应该终止并且应该处理C++线程对象.我需要什么C++ 11工具?
我看过了std::async,但找不到我案例的用法示例.它似乎是一个非常复杂的系统,我需要以某种方式存储和操作std::future它或它变得同步(如果我的理解是正确的;我没有找到一篇好的明确文章std::async).
mer*_*011 36
只需在创建后立即分离.
std::thread([](){ run_async_task(); }).detach();
Run Code Online (Sandbox Code Playgroud)
分离后,线程将不再可连接,因此~thread()无效.
这个答案讨论了这种行为的更多细节.
如下面的WB所述,std::async由于以下原因,从此引用中提取不起作用.
如果从std :: async获取的std :: future具有临时对象生存期(未移动或绑定到变量),则std :: future的析构函数将在完整表达式结束时阻塞,直到异步操作完成
Mil*_*kic 23
复活一个旧线程,但是有一个巧妙的技巧*如何通过使用来实现“即发即弃”功能std::async,尽管std::future它返回了阻塞。主要成分是返回的共享指针,std::future该指针在 lambda 中按值捕获,导致其引用计数器递增。这样,在std::futurelambda 完成其工作之前不会调用的析构函数,根据需要提供真正的异步行为。
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();
});
}
Run Code Online (Sandbox Code Playgroud)
*感谢我的同事和真正的 C++ 专家 MVV,他向我展示了这个技巧。