task_group は、同時に実行するタスクのグループを表します。タスクは実行とともに動的にグループに追加されます。
#include "tbb/task_group.h" using namespace tbb; int Fib(int n) { if( n<2 ) { return n; } else { int x, y; task_group g; g.run([&]{x=Fib(n-1);}); // タスクを作成 g.run([&]{y=Fib(n-2);}); // 別のタスクを作成 g.wait(); // 両方のタスクが完了するのを待つ return x+y; } }
タスク作成はシリアルのボトルネックとなるため、1 つの task_group で大量のタスクを作成することはスケーラブルではありません。大量の並列タスクを作成する場合は、parallel_for や parallel_invoke を代わりに使用するか、タスクを再帰ツリーとして作成する構成を検討してください。
namespace tbb { class task_group { public: task_group(); ~task_group(); template<typename Func> void run( const Func& f ); template<typename Func> void run( task_handle<Func>& handle ); template<typename Func> void run_and_wait( const Func& f ); template<typename Func> void run_and_wait( task_handle<Func>& handle ); task_group_status wait(); bool is_canceling(); void cancel(); } }