std::async - std::launch::async | std::launch::deferred

std::async - std::launch::async | std::launch::deferred

本文关键字:std launch async deferred      更新时间:2023-10-16

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

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

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

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

因此,总是选择其中一个的实现是合法的(这就是gcc所做的,总是选择延迟),就像选择std::launch::async直到达到某个极限,然后切换到std::launch::deferred一样。

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

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

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(与没有policy参数的async相同)。

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