std :: async(std :: launch :: deferred)+ std :: future :: then的行为

Dav*_*aim 21 c++ concurrency stdasync c++17 std-future

延迟未来背后的想法(仅通过std::async使用std::launch::deferredflag 调用实现)是仅当有人试图等待或拉动未来的未来价值或例外时才调用回调.到那时,回调没有被执行.

如果我将续约延迟到延期的未来,会发生什么std::future::then?延迟的未来将丢失(then使未来无效),而是返回新的未来.

在这种情况下,根据标准,会发生什么?新的未来是一个延期的未来吗?会不会陷入僵局?最新文档中未解决此问题.

Yak*_*ont 2

在我看来,这似乎是TS中的一个错误。或者至少是一个记录不足的陷阱。

\n\n

以下是 TS 中的文本:

\n\n

2.3 [futures.unique_future]/6-10

\n\n
\n
template <class F>\nsee below then(F&& func);\n
Run Code Online (Sandbox Code Playgroud)\n\n

要求:

\n\n
INVOKE(DECAY_COPY (std::forward<F>(func)), std::move(*this)) shall be a valid expression.\n
Run Code Online (Sandbox Code Playgroud)\n\n

效果:

\n\n

该函数创建与返回的 future 对象关联的共享状态。此外,

\n\n

当对象的共享状态准备就绪时,INVOKE(DECAY_COPY(std::forward<F>(func)), std::move(*this))将在未指定的执行线程上调用延续,并DECAY_COPY()在随后调用的线程中对调用进行评估。

\n\n

从延续返回的任何值都作为结果存储在结果未来的共享状态中。从延续的执行传播的任何异常都作为异常结果存储在结果未来的共享状态中。

\n\n

返回:

\n\n

result_of_t<decay_t<F>(future<R>)>为 时future<R2>,对于某种类型 R2,该函数返回future<R2>。否则,该函数返回future<result_of_t<decay_t<F>(future<R>)>>。[ 注意:上述规则称为隐式展开。如果没有这条规则,那么采用可调用返回 a 的返回类型future<R>将是future<future<R>>。该规则避免了此类嵌套的 future 对象。下面的类型f2future<int>和不是future<future<int>>

\n\n

[ 例子:

\n\n
future<int> f1 = g();\nfuture<int> f2 = f1.then([](future<int> f) {\n                    future<int> f3 = h();\n                    return f3;\n                 });\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x94 结束示例]

\n\n

\xe2\x80\x94 尾注]

\n\n

后置条件:

\n\n

valid() == false关于原本的未来。valid() == true关于未来从那时回来。[ 注意:在隐式展开的情况下,从 thenfunc 返回的 future 的有效性只有在延续完成之后才能确定。如果它无效,则生成的 future 将变为就绪状态,并出现类型为 的异常std::future_error,错误条件为std::future_errc::broken_promise。\xe2\x80\x94 尾注]

\n
\n\n

推迟的未来任务没有特殊情况。如果该延迟的未来任务在调用 之前尚未准备好.then,则无法使其准备好,因此无法func调用 的腐烂副本。

\n\n

的文字shared_future类似;但是,您仍然可以shared_future在调用后使 准备就绪.then

\n\n

如果这是有意的;.then在未就绪的延迟唯一未来上,将导致永远无法就绪的返回值-future这应该在 TS/标准中明确说明。如果这不是本意,则需要更改标准文本。

\n\n

请注意,这些更改并未出现在2018 年发布的N4762 标准草案中。

\n\n

我不确定标准应该如何解决这个问题;语义.then对于 a 是合理的,shared_future但对于 a 则不然future,并且不同的语义会令人惊讶。

\n