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