例外なしでグラフ実行をキャンセルするには、明示的な 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 を取得できます。