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

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

関連情報