我什么时候需要使用std :: async(std :: launch :: async,func())而不是func()?

时间:2013-11-21 14:03:52

标签: c++ c++11 asynchronous

我不明白将std::asyncstd::lauch::async标志一起使用的原因,而不是简单地调用传递给std::async的函数。有特价保证吗?

2 个答案:

答案 0 :(得分:4)

根据the documentation一个只接受函数及其参数的重载。您正在使用接受更具体的策略的重载

async(f, args...)相当于async(std::launch::async | std::launch::deferred, f, args...),其中两个标志的存在使得实现关于函数是否简单地从当前调用堆栈解耦(延迟到执行第一个非定时等待函数;这称为延迟评估),或实际上是多线程的。

使用 std::launch::async,确保该函数在其自己的线程中明确执行,避免任何阻止调用线程。

当然,这两种变体仍然完全不同于直接简单地调用f(args...),这可以保证立即进行评估。

答案 1 :(得分:1)

是的,调用线程不会阻塞,因为std :: async会生成一个单独的线程来调用该函数。这意味着如果您单击GUI按钮以开始处理复杂任务,这将需要几分钟,然后GUI响应,尽管处理尚未完成。