非死book為C++11帶來了健壯且強大的Folly Futures庫
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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!