std :: async - std :: launch :: async |的std ::推出::推迟

时间:2012-02-20 10:56:00

标签: c++ c++11 future

我理解std::async对以下参数的作用。

  • std::launch::async
  • std::launch::deferred

然而,std::launch::async | std::launch::deferred会发生什么?

2 个答案:

答案 0 :(得分:9)

std::launch::async | std::launch::deferred的启动政策意味着实施可以选择是否应用std::launch::asyncstd::launch::deferred的政策。这种选择可能因电话而异,可能不会立即决定。

总是选择一个或另一个的实现因此是合法的(这是gcc所做的,总是选择延迟),就像选择std::launch::async直到达到某个限制,然后切换到{{1 }}

这也意味着实施可以将选择推迟到以后。这意味着实现可能会等待做出决定,直到通过具有与延迟和异步任务明显不同影响的调用强制执行,或者直到运行任务的数量小于内部任务限制。这就是just::thread的作用。

强制做出决定的函数包括:std::launch::deferredwait()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启动新线程。