task_group クラス

説明

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_forparallel_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()

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 テンプレート・メソッドは、runwait を個別に呼び出すよりも効率的になるように設計されています。

template<typename Func> task_group_status run_and_wait( task_handle<Func>& handle );

{run(handle); return wait();} と等価ですが、handle() が現在のスレッドで実行されることを保証します。

run_and_wait テンプレート・メソッドは、runwait を個別に呼び出すよりも効率的になるように設計されています。

task_group_status wait()

グループのすべてのタスクが完了する、またはキャンセルされるのを待ちます。

戻り値: task_group のステータス。詳細

bool is_canceling()

戻り値: このタスクグループがタスクをキャンセルしている場合は true。

void cancel()

この task_group のすべてのタスクをキャンセルします。