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

时间:2016-01-29 00:05:38

标签: c++ c++14

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

2 个答案:

答案 0 :(得分: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
   });
}
     

[..]

     

在前一个完成之前,每个延续都不会开始。

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

此外,还为您完成了一些异常处理魔术。我建议阅读定义std::future::then实际上会做什么的提案,但我承认,并没有太多的&#34;理由&#34;那里的部分:它似乎集中在阻止你的主线程等待未来完成的缺点,并没有提到你陈述的替代用例。好吧,也许这就是问题所在:这个功能并非非常适合取代它。这就是为什么你在努力寻找功能差异的原因。

  

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

答案 1 :(得分:3)

  

...... async([](){x(); y();})async([](){x();}).then([](){y();})之间有什么区别?

真的不多 - 那么为什么呢?

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

这并不是说一个是正确的而另一个是错的 - 它只是意味着那些语义(.then())在处理异步操作时特别有意义。

单线程计算的语言类似于&#34;执行此操作执行此操作执行此操作...&#34;,异步语言计算是&#34;这样做,当它完成时,然后执行此操作,当它完成时,然后执行此操作...&#34; < / p>