Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解std::future::then的延续 可以用C++中的一个例子解释 AsiNC([]({)(x));(?); >和异步([]({)());然后([]({());我的理解是,在后一种情况下,x,y可能会立即在不同的线程中启动,并且只有在将来作为输入传递时调用get()时才会阻塞(在各自的线程中)。_C++_C++14 - Fatal编程技术网

理解std::future::then的延续 可以用C++中的一个例子解释 AsiNC([]({)(x));(?); >和异步([]({)());然后([]({());我的理解是,在后一种情况下,x,y可能会立即在不同的线程中启动,并且只有在将来作为输入传递时调用get()时才会阻塞(在各自的线程中)。

理解std::future::then的延续 可以用C++中的一个例子解释 AsiNC([]({)(x));(?); >和异步([]({)());然后([]({());我的理解是,在后一种情况下,x,y可能会立即在不同的线程中启动,并且只有在将来作为输入传递时调用get()时才会阻塞(在各自的线程中)。,c++,c++14,C++,C++14,这样的get()永远不会阻塞。这是在相关提案中设计的 #包括 使用名称空间std; int main(){ future f1=async([](){return 123;}); 未来f2=f1。然后([](未来f){ 返回f.get().to_string();//here.get()不会阻塞 }); } [……] 在上一步完成之前,不会开始每一步 这样做的好处是,您现在可以以一种表达的方式组合多个异步操作。你能把所有的代码打包成一个lambda吗?当然但是呃。不可重复使用,也不可特别维护

这样的
get()
永远不会阻塞。这是在相关提案中设计的

#包括
使用名称空间std;
int main(){
future f1=async([](){return 123;});
未来f2=f1。然后([](未来f){
返回f.get().to_string();//here.get()不会阻塞
});
}
[……]

在上一步完成之前,不会开始每一步

这样做的好处是,您现在可以以一种表达的方式组合多个异步操作。你能把所有的代码打包成一个lambda吗?当然但是呃。不可重复使用,也不可特别维护

此外,还为您提供了一些异常处理魔法。我建议阅读定义了
std::future::then
实际将要做什么的提案,尽管我承认其中的“基本原理”部分并不多:它似乎关注阻止主线程等待未来完成的不利因素,并且没有提及您声明的替代用例。嗯,也许这就是问题所在:这个特性并不是为了取代它而设计的。这就是为什么你在努力寻找功能上的差异

在异步编程中,一个异步操作在完成时调用第二个操作并向其传递数据是非常常见的。当前的C++标准不允许登记将来的延续。然后,不再等待结果,而是将一个continuation“附加”到异步操作,在结果就绪时调用该操作。使用.then函数注册的Continuations将有助于避免阻塞等待或在轮询时浪费线程,从而大大提高应用程序的响应能力和可伸缩性

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

其实不多——那为什么要买呢

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

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


单线程计算的语言类似于“做这个,做这个,做这个…”,异步计算的语言是“做这个,当它完成时,再做这个,当它完成时,再做这个…”

然后
?这是什么成员函数?如果我不是,它将在下一个标准中成为std::future的成员wrong@Columbo:请参阅。对不起,没有“z”。固定的。我用伪语言来表示简短。我认为这很清楚,不是吗?你为什么不写实际的代码,而不是伪代码呢?特别是当你问起代码的作用时?facepalm@immibis:我的观点是,执行“”的函数不会使这些不同的逻辑片段中的任何一个独立地可重用。如果这是两个lambda,那么您就有了最大的灵活性,可以随心所欲地组合它们。下面是“不可重用”的单个lambda:
[](){x();y();}
。整个lambda表达式是否像两个单独的lambda一样可重用?不,这有一点关系吗?不,因为您仍然可以重用
x
y
@immibis:在这个精心设计的示例中,当然可以,但是我假设一个更一般的情况,lambda本身不仅仅是两个进一步的函数调用。
#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
   });
}