非死book為C++11帶來了健壯且強大的Folly Futures庫

jopen 9年前發布 | 6K 次閱讀 C++11

Future是一種用于同步并發操作的構件,它能夠被視為對異步操作結果的只讀代理對象,這個對象的初始值是未知的。如果Future的客戶端試圖在操作完成前讀取它的值,

可能會被阻塞。Future通常和一個Promise關聯,Promise提供對Future的值進行寫訪問。

異步操作能夠立即返回只讀的Future,而不阻塞,示例代碼片段如下:

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

這里的asyncOperation是一個異步調用的包裝。Future的客戶端能夠通過isReady()方法檢查其關聯的Promise是否已經完成,并通過value()方法獲取其結果。

Future由它關聯的Promise創建,當異步操作完成時,可以通過setValue()或者setWith()方法設置它的結果:

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

olly Futures庫真正強大之處在于其Future::then方法,該方法能夠方便地進行鏈式回調,避免進入回調地獄(callback hell)。回調鏈可以這樣來表示:
Future<OutputA> futureA(Output);
Future<OutputB> futureB(OutputA);
Future<OutputC> futureC(OutputB);
OutputD d(OutputC) {
  if (somethingExceptional) throw anException;
  return OutputD();
}
Future<double> fut =
  fooFuture(input)
  .then(futureA)
  .then(futureB)
  .then(futureC)
  .then(d)
  .then([](OutputD outputD) { // 同樣支持lambda表達式
    return outputD * M_PI;
  });

Folly Futures庫提供的另一個強大的構建塊是集合方法,它允許將Future集合視為一個Future,這個Future在集合中的全部Future完成時完成。

和集合方法類似,Folly Futures庫還提供了方法:

  • collectAny:當集合中的任何一個Future完成時即完成。
  • collectN:等待N個Future完成后完成。
  • map:參數為Future集合和一個函數,針對集合參數中的每個Future,調用函數參數的then()方法。返回值是一個新的Future數組。
  • reduce:參數為Future集合和帶有兩個參數的函數(reduce的值和reduce序列中的下一個值),針對集合參數中的每個Future,依次調用函數參數。
  • </ul>

    最后,Folly Futures還支持通過執行上下文來控制回調的執行。例如,你能夠給then方法傳入一個執行器對象,指定此次回調應該通過這個執行器來執行:

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

    更多信息可以參見Folly Future的文檔

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

    來自:http://www.infoq.com/cn/news/2015/07/非死book-folly-futures

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!