待機するタスクをキューに入れてから、メインスレッド外で実行するグラフを破棄してください。
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()) ); // 待機しないでほかのことを行う ... }
上記のコードで、キューに入れられたタスクがいつ実行されるかは分かりません。キューに入れられたタスクが生成する結果を使用したり、プログラムが終了する前に、タスクが完了したことを確認しなければならない場合は、グラフが完了したキューに入れられたタスクからシグナルを受け取る手法を利用します。キューに入れられたタスクについての詳細は、デベロッパー・リファレンスを参照してください。