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