有人能用C++中的一个例子来解释async([](){x(); y();})和async([](){x();}).then([](){y();})之间的区别吗?我的理解是,在后一种情况下,每个x都可能立即在不同的线程中启动,并且只会阻塞(在它们各自的线程中),如果在将来作为输入传递的时候调用get()。
发布于 2016-01-29 00:30:15
这样的get()永远无法阻止。这是由设计在有关的建议,N3558。
#包括使用命名空间std;int main() {未来的f1 =异步({返回123;});未来的f2 =f1.然后(future f{返回f.get().to_string();//这里.get()不会阻塞}); 。。 在前面的工作完成之前,每个延续都不会开始。
好处是,您现在可以以一种表达的方式组合几个异步操作。你能把所有的代码打包成一个lambda吗?好的。但是新的。不能重复使用,也不特别可维护。
此外,还有一些异常处理魔术为您所做。我建议阅读定义std::future::then实际将做什么的建议,尽管我承认其中没有太多的“基本原理”部分:它似乎集中于阻塞等待未来完成的主线程的缺点,而没有提到您声明的替代用例。嗯,也许这就是问题所在:这个特性并不是用来替换它的。这就是为什么你很难找到功能上的差异。
在异步编程中,一个异步操作在完成后调用第二个操作并将数据传递给它是非常常见的。当前的C++标准不允许注册将来的延续。使用.then时,不需要等待结果,而是将一个延续“附加”到异步操作,在结果准备就绪时调用该操作。使用.then函数注册的连续性将有助于避免阻塞等待或在轮询中浪费线程,大大提高应用程序的响应性和可伸缩性。
发布于 2016-03-04 08:01:10
..。
async([](){x(); y();})和async([](){x();}).then([](){y();})有什么区别?
没什么-那为什么要这么做呢?
一个词的可合成性。它允许我们在异步环境中构建基于模块函数(或部分功能)的抽象,并给出问题域的表达方式。
这并不是说一个是对的,另一个是错的--这仅仅意味着(.then()的)那些语义在处理异步操作时特别有意义。
单线程计算的语言是这样的:“做这个.”(在我们继续做其他事情之前),异步计算的语言是“做这个,当它做了,然后做这个,当它做了,然后做这个.”(当我们继续做其他事情时)。
https://stackoverflow.com/questions/35074578
复制相似问题