Asynchronous Fork/Join using Asio
Boost.Asio作者Chrisさんによるものです。
これはいいですね。実行するスレッド数もユーザーコードから制御できる。
void calc_fib( asio::io_service& io_service, int n, function<void(int)> f) { if (n <= threshold) { f(seq_fib(n)); } else { coinvoke<void(int), void(int)>(io_service, [&io_service, =n](function<void(int)> c) { calc_fib(io_service, n - 1, c), }, [&io_service, =n](function<void(int)> c) { calc_fib(io_service, n - 2, c), }, [=f](int a, int b) { f(a + b); }); } }