N2709 - 非同期実行のための Packaging Tasks
スレッドから値を返してもらうためのクラス。
全く同じ事が promise を使ってやることが出来るけど、このクラスを使えば凄く簡単になります。
また、このクラスは関数オブジェクトなので、これをそのまま std::thread に放り込むことが出来ます。これが出来ると何が嬉しいかというと、スレッドプールが簡単に作れるようになります。
id:melpon:20081204 と同じ処理を packaged_task を使って書いてみるとこうなります。
// 裏スレッドで task を実行する関数 template<class F> std::unique_future<typename std::result_of<F>::type> do_task(F f) { typedef typename std::result_of<F>::type result_type; std::packaged_task<result_type> t(std::move(f)); std::unique_future<result_type> res(t.get_future()); std::thread(std::move(t)); return res; }
int do_something();
// 裏スレッドで処理を行う std::unique_future<int> future = do_task(do_something); // 何か別の処理をする ... // 裏スレッドの結果が本当に必要になったので取得する // もし裏スレッドの処理が終わってない場合は、その処理が終わるのを待つ try { int result = future.get(); std::cout << result << std::endl; } catch (...) { std::cout << "error" << std::endl; }