task_group は、同時に実行するタスクのグループを表します。タスクは実行とともに動的にグループに追加されます。
#include "tbb/task_group.h" int Fib(int n) { if( n<2 ) { return n; } else { int x, y; tbb::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(); // C++11 より前でサポート template<typename Func> void run( const Func& f ); // C++11 以降でサポート template<typename Func> void run( Func&& f ); template<typename Func> void run( task_handle<Func>& handle ); template<typename Func> task_group_status run_and_wait( const Func& f ); template<typename Func> task_group_status run_and_wait( task_handle<Func>& handle ); task_group_status wait(); bool is_canceling(); void cancel(); }; }
メンバー | 説明 |
---|---|
task_group() | 空の task_group を構築します。 |
~task_group() | task_group を破棄します。 要件: wait メソッドは task_group を破棄する前に呼び出さなければなりません。そうしないと、デストラクターが例外をスローします。 |
C++11 よりも前:template<typename Func> void run( const Func& f ) C++11 以降:template<typename Func> void run( Func&& f ) |
f() を計算するタスクをスポーンして直ちにリターンします。 |
template<typename Func> void run ( task_handle<Func>& handle ); | handle() を計算するタスクをスポーンして直ちにリターンします。 |
template<typename Func> task_group_status run_and_wait( const Func& f ) | {run(f); return wait();} と等価ですが、f() が現在のスレッドで実行されることを保証します。 注run_and_wait テンプレート・メソッドは、run と wait を個別に呼び出すよりも効率的になるように設計されています。 |
template<typename Func> task_group_status run_and_wait( task_handle<Func>& handle ); | {run(handle); return wait();} と等価ですが、handle() が現在のスレッドで実行されることを保証します。 注run_and_wait テンプレート・メソッドは、run と wait を個別に呼び出すよりも効率的になるように設計されています。 |
task_group_status wait() | グループのすべてのタスクが完了する、またはキャンセルされるのを待ちます。 戻り値: task_group のステータス。詳細 |
bool is_canceling() | 戻り値: このタスクグループがタスクをキャンセルしている場合は true。 |
void cancel() | この task_group のすべてのタスクをキャンセルします。 |