Boost.Asio io_serviceによる並行アルゴリズムの実装

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);
        });
  }
}