メインスレッド外で実行するグラフの破棄

待機するタスクをキューに入れてから、メインスレッド外で実行するグラフを破棄してください。

wait_for_all() を呼び出してメインのアプリケーション・スレッドをブロックしたくないこともあるでしょう。しかし、グラフを破棄する前にグラフで wait_for_all を呼び出すことが最も安全です。一般的なソリューションは、構築するタスクをキューに入れてグラフが完了するのを待つことです。例えば、wait_for_all() を常に使用するの例で wait_for_all を呼び出さない場合は、代わりに、グラフを作成して完了を待つタスクをキューに入れます。

class background_task : public tbb::task {
public:
  /* オーバーライド */ task *execute() {
    graph g;
    function_node< int, int > f( g, 1, []( int i ) -> int {
      return spin_for(i);
    } );
    f.try_put(1);
    g.wait_for_all();
    return NULL;
  }
};

void no_wait_for_all_enqueue() {
  task::enqueue( * (new( task::allocate_root() ) background_task()) );
  // 待機しないでほかのことを行う ...
}

上記のコードで、キューに入れられたタスクがいつ実行されるかは分かりません。キューに入れられたタスクが生成する結果を使用したり、プログラムが終了する前に、タスクが完了したことを確認しなければならない場合は、グラフが完了したキューに入れられたタスクからシグナルを受け取る手法を利用します。キューに入れられたタスクについての詳細は、デベロッパー・リファレンスを参照してください。

関連情報