c++ - 未来是否从 std::async 返回并带有析构函数中的 launch::deferred 策略块?
问题描述
在描述中std::async
说:
如果
std::future
获取的 fromstd::async
没有从引用移动或绑定到引用,则析构函数std::future
将阻塞在完整表达式的末尾,直到异步操作完成,本质上使如下代码同步:std::async(std::launch::async, []{ f(); }); // temporary's dtor waits for f() std::async(std::launch::async, []{ g(); }); // does not start until f() completes
(请注意,通过调用 std::async 以外的方式获得的 std::futures 的析构函数永远不会阻塞)
这种说法令人困惑,我不清楚在std::launch::deferred
政策的情况下应该采取什么行为。好的,实验表明它不会阻塞,但我想知道标准是否明确表示从策略返回的未来std::async
不会std::launch::deferred
阻塞析构函数。
这引发了关于默认策略的另一个后续问题:如果未来从std::async
析构函数中的块返回,并且在 的情况下std::launch::async
不阻塞,那么在默认 ( ) 策略的情况下std::launch::deferred
,这将导致非常不一致的行为。std::launch::async | std::launch::deferred
最近我在问std::async
with default launch policy的语义:什么是 std::async with automatic (launch::async|launch::deferred) 启动策略的语义?,这个例子更让我困惑,而且我们不明确知道策略的平台选择的模式的适用性,是非常值得怀疑的。
更新:我发现了一个标准P0701r1的提案,它没有完全回答我的问题,但如果这个提案被接受,它将解决阻塞/非阻塞析构函数的歧义。
解决方案
推荐阅读
- php - 库的扩展名和二进制文件是什么意思?
- flutter - 当用户在 Flutter 中离开当前屏幕时调用函数
- ios - 相机沿x轴移动时如何限制SCNNode移动?
- javascript - 如何使用 JINJAVA 将 Java 字符串值或字符串列表传递给 javascript
- php - 来自 PHP CLI 的 gRPC 调用被卡住
- python - 如果值不存在则如何创建条件然后发生一些顺序动作,如果值不存在则发生其他动作
- google-sheets - 使用谷歌表格在图表中保持单元格引用不变?
- jquery - 使用 php 使用 ajax 上传 jquery 文件
- mysql - 两个表之间的查询慢
- javascript - 滚动 - 内容拉伸动画