首页 > 解决方案 > 未来是否从 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::asyncwith default launch policy的语义:什么是 std::async with automatic (launch::async|launch::deferred) 启动策略的语义?,这个例子更让我困惑,而且我们不明确知道策略的平台选择的模式的适用性,是非常值得怀疑的。

更新:我发现了一个标准P0701r1的提案,它没有完全回答我的问题,但如果这个提案被接受,它将解决阻塞/非阻塞析构函数的歧义。

标签: c++c++11language-lawyerfuturestdasync

解决方案


推荐阅读