#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() を並列に評価します。g と h は、ローカルステートを保持できる関数オブジェクトであることが分かります。
#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);} ); }