了解std :: future :: then的延续

Mar*_*tin 7 c++ c++14

任何人都可以在C为例解释++之间有什么区别async([](){x(); y();})async([](){x();}).then([](){y();})?我的理解是,在后一种情况下,每个的xy将可能在不同的线程立即启动,只会阻塞(在各自的线程),如果get()是在未来作为输入传递调用。

Nia*_*all 6

...async([](){x(); y();})和 和有async([](){x();}).then([](){y();})什么不一样?

真的不多——那为什么要呢?

一个词的可组合性。它允许我们在异步环境中以给定问题域的表达方式构建基于模块化功能(或功能块)的抽象。

这并不是说一个是对的,另一个是错的——它只是意味着这些语义(of .then())在处理异步操作时特别有意义。

单线程计算的语言是什么“这样做,并做到这一点,并做到这一点......”,异步计算的语言是“做到这一点,当它完成,然后做到这一点,当它完成,然后做这个...”


Lig*_*ica 5

这样一个get()永远不会阻止。这是在相关建议N3558中设计的。

#include <future>
using namespace std;
int main() {
   future<int> f1 = async([]() { return 123; });

   future<string> f2 = f1.then([](future<int> f) {
        return f.get().to_string(); // here .get() won’t block
   });
}
Run Code Online (Sandbox Code Playgroud)

[..]

在前面的操作完成之前,每个继续操作都不会开始。

好处是您现在可以以表达方式组合多个异步操作。您可以将所有代码捆绑到一个lambda中吗?当然。但是。不可重复使用,也不是特别可维护。

此外,还有一些为您完成的异常处理魔术。我建议您阅读定义std::future::then实际用途的提案,尽管我承认其中没有“ Rationale”部分的内容:它似乎侧重于阻止主线程等待未来完成的缺点,而且没有提及您陈述的替代用例。好吧,也许就是问题所在:此功能并非旨在取代它。这就是为什么您要努力找到功能差异的原因。

在异步编程中,通常一个异步操作完成后便调用第二个操作并将数据传递给它。当前的C ++标准不允许注册将来的延续。使用.then,而不是等待结果,而是将连续性“附加”到异步操作,当结果准备好时,将调用异步操作。使用.then函数注册的连续性将有助于避免阻塞轮询等待或浪费线程,从而极大地提高了应用程序的响应能力和可伸缩性。