[关闭]
@babydragon 2015-07-25T19:46:02.000000Z 字数 1736 阅读 3163

Facebook为C++11带来了健壮且强大的Folly Futures库

最近,Facebook推出了Folly Futures库,它是一个提供Futures实现的C++11库,功能超越C++11标准库已经提供的std::future

Future是一种用于同步并发操作的构件,它能够被视为对异步操作结果的只读代理对象,这个对象的初始值是未知的。如果Future的客户端试图在操作完成前读取它的值,
可能会被阻塞。Future通常和一个Promise关联,Promise提供对Future的值进行写访问。

异步操作能够立即返回只读的Future,而不阻塞,示例代码片段如下:

  1. #include <folly/futures/Future.h>
  2. using folly::Future;
  3. Future<Output> asyncOperation(Input);
  4. Future<Output> f = asyncOperation(input);

这里的asyncOperation是一个异步调用的包装。Future的客户端能够通过isReady()方法检查其关联的Promise是否已经完成,并通过value()方法获取其结果。

Future由它关联的Promise创建,当异步操作完成时,可以通过setValue()或者setWith()方法设置它的结果:

  1. using folly::Promise;
  2. Future<double> getEnergy(int year) {
  3. auto promise = make_shared<Promise<double>>();
  4. std::thread([=]{
  5. promise->setWith(std::bind(getEnergySync, year));
  6. }).detach();
  7. return promise->getFuture();
  8. }

Folly Futures库真正强大之处在于其Future::then方法,该方法能够方便地进行链式回调,避免进入回调地狱(callback hell)。回调链可以这样来表示:

  1. Future<OutputA> futureA(Output);
  2. Future<OutputB> futureB(OutputA);
  3. Future<OutputC> futureC(OutputB);
  4. OutputD d(OutputC) {
  5. if (somethingExceptional) throw anException;
  6. return OutputD();
  7. }
  8. Future<double> fut =
  9. fooFuture(input)
  10. .then(futureA)
  11. .then(futureB)
  12. .then(futureC)
  13. .then(d)
  14. .then([](OutputD outputD) { // 同样支持lambda表达式
  15. return outputD * M_PI;
  16. });

Folly Futures库提供的另一个强大的构建块是集合方法,它允许将Future集合视为一个Future,这个Future在集合中的全部Future完成时完成。
和集合方法类似,Folly Futures库还提供了方法:

最后,Folly Futures还支持通过执行上下文来控制回调的执行。例如,你能够给then方法传入一个执行器对象,指定此次回调应该通过这个执行器来执行:

  1. struct Executor {
  2. using Func = std::function<void()>;
  3. virtual void add(Func) = 0;
  4. };
  5. a(input).then(executor, b);

更多信息可以参见Folly Future的文档

查看英文原文:Facebook Folly Brings Robust, Powerful Futures to C++11

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注