std::async - std::launch::async | std::launch::deferred
std::async - std::launch::async | std::launch::deferred
我了解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
启动新的线程。
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- 标准C++11是否保证std::async(std::launch::asyncfunc)在单独的线程中启动func
- std::async 似乎没有使用 std::launch::async 生成线程
- std::launch::async就像同步进程一样阻塞
- 是否需要std::launch::async策略
- std::async不使用std::launch::async策略启动新线程
- 何时需要使用std::async(std::launch::asyncfunc())而不是func(()
- 在 c++11 中,如何将 std::async 与 std::launch::any 一起使用
- GCC 的行为与 std::async(std::launch::async) 与 Clang 的行为
- std::async与std::launch::async策略的行为
- std::async - std::launch::async | std::launch::deferred
- 默认启动策略和std::launch::deferred之间的区别
- emulate std::async with std::launch::sync?
- 为什么std::async即使指定了std::launch::async标志,也要同步调用函数?
- 关于由 std::async 与 std::launch::async 参数启动的线程的混淆