parallel_invoke テンプレート関数

概要

複数の関数を並列に評価するテンプレート関数。

ヘッダー

#include "tbb/parallel_invoke.h"

構文

template<typename Func0, typename Func1>
void parallel_invoke(const Func0& f0, const Func1& f1);

template<typename Func0, typename Func1, typename Func2>
void parallel_invoke(const Func0& f0, const Func1& f1, const Func2& f2);
template<typename Func0, typename Func1, ..., typename Func9>
void parallel_invoke(const Func0& f0, const Func1& f1, ..., const Func9& f9);

C++11 の rvalue 参照のサポートが普及すると、仮引数は rvalue 参照に変更される可能性があります。

説明

parallel_invoke(f0,f1,...,fk) 式は、f0()、f1()、...、fk() を並列に評価します。2 ~ 10 個の引数を指定できます。各引数は、operator() が定義された型でなければなりません。通常、引数は関数オブジェクトまたは関数へのポインターです。戻り値は無視されます。

サンプル

次のサンプルは、f()、g()、h() を並列に評価します。gh は、ローカルステートを保持できる関数オブジェクトであることが分かります。

#include "tbb/parallel_invoke.h"

using namespace tbb;

void f();
extern void bar(int);

class MyFunctor {
    int arg;
public:
    MyFunctor(int a) : arg(a) {}
    void operator()() const {bar(arg);}
};

void RunFunctionsInParallel() {
    MyFunctor g(2);
    MyFunctor h(3);
    tbb::parallel_invoke(f, g, h );
}
  

ラムダ式のサンプル

以下に C++11 ラムダ式で前述のサンプルを記述し直したものを示します。関数オブジェクトを生成します。

#include "tbb/parallel_invoke.h"

using namespace tbb;

void f();
extern void bar(int);

void RunFunctionsInParallel() {
    tbb::parallel_invoke(f, []{bar(2);}, []{bar(3);} );
}