メインスレッド外で実行するグラフの破棄#
メインスレッド外部で実行されるグラフを待機して破棄するタスクを必ずキューに登録してください。
wait_for_all() を呼び出してアプリケーションのメインスレッドを常にブロックする必要はありません。ただし、グラフを破棄する前に、グラフ上で wait_for_all を呼び出すのは安全です。一般的な解決策は、ビルドするタスクをキューに登録し、グラフが完了するまで待機することです。例えば、常に wait_for_all() を使用するの例で、wait_for_all を呼び出したくない場合、代わりに、グラフを作成して待機するタスクをキューに追加できます。
class background_task {
public:
void operator()() {
graph g;
function_node< int, int > f( g, 1, []( int i ) -> int {
return spin_for(i);
} );
f.try_put(1);
g.wait_for_all();
}
};
void no_wait_for_all_enqueue() {
task_arena a;
a.enqueue(background_task());
// 待機せずに他のことを行います …
}上記のコードでは、キューに投入されたタスクはある時点で実行されますが、いつ実行されるかは明確ではありません。キューに投入されたタスクの結果を待機する必要がある場合、またはプログラムが終了する前にタスクが完了することを保証する必要がある場合は、グラフが完了したことをキューに投入されたタスクから通知するメカニズムを実装する必要があります。