8

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

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

但是,会发生什么std::launch::async | std::launch::deferred

4

2 回答 2

10

的启动策略std::launch::async | std::launch::deferred意味着实现可以选择是否应用std::launch::async或的策略std::launch::deferred。此选择可能因呼叫而异,并且可能不会立即决定。

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

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

强制决定的函数是:wait(), get(), wait_for(),wait_until()和最后一个引用结果的未来对象的析构函数。

于 2012-02-20T14:01:27.037 回答
2

ISO IEC 14882-2011 的第 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(与asyncpolicy参数相同)。

实际上,这意味着async只要有未使用的 CPU 内核,C++ 运行时就应该为每个线程启动新线程。

于 2012-02-20T11:31:48.083 回答