例外なしでグラフ実行をキャンセルするには、明示的な task_group_context を使用してグラフを作成し、そのオブジェクトで cancel_group_execution() を呼び出します。次に例を示します。
task_group_context t; graph g(t); function_node< int, int > f1( g, 1, []( int i ) { return i; } ); function_node< int, int > f2( g, 1, []( const int i ) -> int { cout << "Begin " << i << "\n"; spin_for(0.2); cout << "End " << i << "\n"; return i; } ); function_node< int, int > f3( g, 1, []( int i ) { return i; } ); make_edge( f1, f2 ); make_edge( f2, f3 ); f1.try_put(1); f1.try_put(2); spin_for(0.1); t.cancel_group_execution(); g.wait_for_all();
グラフの実行がキャンセルされると、すでに実行を開始しているノードは完了するまで実行されますが、実行を開始していないノードは実行されません。このため、上記の例で、f2 は入力 1 の Begin および End メッセージを出力しますが、入力 2 は受け取りません。
ノードのボディーからノードが属する task_group_context を取得して、そのノードが属するグラフの実行をキャンセルすることもできます。
graph g; function_node< int, int > f1( g, 1, []( int i ) { return i; } ); function_node< int, int > f2( g, 1, []( const int i ) -> int { cout << "Begin " << i << "\n"; spin_for(0.2); cout << "End " << i << "\n"; task::self().group()->cancel_group_execution(); return i; } ); function_node< int, int > f3( g, 1, []( int i ) { return i; } ); make_edge( f1, f2 ); make_edge( f2, f3 ); f1.try_put(1); f1.try_put(2); g.wait_for_all();
構築時にグラフが明示的に渡されなかった場合でも、ノードのボディーから task_group_context を取得できます。