グラフの明示的なキャンセル

グラフの明示的なキャンセル#

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