N2709 - 非同期実行のための Packaging Tasks

http://melpon.tank.jp/pukiwiki147/index.php?Memo%2F%CB%DD%CC%F5%2FN2709%20-%20Packaging%20Tasks%20for%20Asynchronous%20Execution


スレッドから値を返してもらうためのクラス。
全く同じ事が 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;
}