Future是一种用于同步并发操作的 构件 ,它能够被视为对异步操作结果的只读代理对象,这个对象的初始值是未知的。如果Future的客户端试图在操作完成前读取它的值,
可能会被阻塞。Future通常和一个Promise关联,Promise提供对Future的值进行写访问。
异步操作能够立即返回只读的Future,而不阻塞,示例代码片段如下:
#includeusing folly::Future; Future
这里的asyncOperation是一个异步调用的包装。Future的客户端能够通过isReady()方法检查其关联的Promise是否已经完成,并通过value()方法获取其结果。
Future由它关联的Promise创建,当异步操作完成时,可以通过setValue()或者setWith()方法设置它的结果:
using folly::Promise; FuturegetEnergy(int year) { auto promise = make_shared >(); std::thread([=]{ promise->setWith(std::bind(getEnergySync, year)); }).detach(); return promise->getFuture(); }
Folly Futures库真正强大之处在于其Future::then方法,该方法能够方便地进行链式回调,避免进入 回调地狱 (callback hell)。回调链可以这样来表示:
FuturefutureA(Output); Future futureB(OutputA); Future futureC(OutputB); OutputD d(OutputC) { if (somethingExceptional) throw anException; return OutputD(); } Future fut = fooFuture(input) .then(futureA) .then(futureB) .then(futureC) .then(d) .then([](OutputD outputD) { // lambdas are ok too return outputD * M_PI; });
Folly Futures库提供的另一个强大的构建块是集合方法,它允许将Future集合视为一个Future,这个Future在集合中的全部Future完成时完成。和集合方法类似,Folly Futures库还提供了方法:
最后,Folly Futures还支持通过 执行上下文 来控制回调的执行。例如,你能够给then方法传入一个执行器对象,指定此次回调应该通过这个执行器来执行:
struct Executor { using Func = std::function; virtual void add(Func) = 0; }; a(input).then(executor, b);
更多信息可以参见Folly Future的 文档 。
查看英文原文: Facebook Folly Brings Robust, Powerful Futures to C++11
感谢丁晓昀对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入InfoQ读者交流群 )。