我理解std::async
对以下参数的作用。
std::launch::async
std::launch::deferred
然而,std::launch::async | std::launch::deferred
会发生什么?
答案 0 :(得分:9)
std::launch::async | std::launch::deferred
的启动政策意味着实施可以选择是否应用std::launch::async
或std::launch::deferred
的政策。这种选择可能因电话而异,可能不会立即决定。
总是选择一个或另一个的实现因此是合法的(这是gcc所做的,总是选择延迟),就像选择std::launch::async
直到达到某个限制,然后切换到{{1 }}
这也意味着实施可以将选择推迟到以后。这意味着实现可能会等待做出决定,直到通过具有与延迟和异步任务明显不同影响的调用强制执行,或者直到运行任务的数量小于内部任务限制。这就是just::thread的作用。
强制做出决定的函数包括:std::launch::deferred
,wait()
,get()
,wait_for()
以及引用结果的最后一个对象的析构函数。
答案 1 :(得分:3)
ISO IEC 14882-2011的Chaprer 30.6.8解释了launch::async | launch::deferred
表示implementations should defer invocation or the selection of the policy when no more concurrency can be effectively exploited
(与没有async
参数的policy
相同)。
实际上,这意味着只要有未使用的CPU核心,C ++运行时就应该为每个async
启动新线程。