例外をスローしないでアルゴリズムをキャンセルするには、式 task::self().cancel_group_execution() を使用します。task::self() 部分は、現在のスレッドの最内インテル® TBB タスクを参照します。cancel_group_execution() を呼び出すと、task_group_context のすべてのタスクがキャンセルされます (詳細は、「キャンセルと入れ子の並列処理」を参照)。メソッドは、実際にキャンセルされる場合は true を、task_group_context がすでにキャンセルされている場合は false を返します。
次のコードは、task::self().cancel_group_execution() の使用方法を示しています。
#include "tbb/tbb.h" #include <vector> #include <iostream> using namespace tbb; using namespace std; vector<int> Data; struct Update { void operator()( const blocked_range<int>& r ) const { for( int i=r.begin(); i!=r.end(); ++i ) if( i<Data.size() ) { ++Data[i]; } else { // 関連タスクをキャンセル if( task::self().cancel_group_execution() ) cout << "Index " << i << " caused cancellation\n"; return; } } }; int main() { Data.resize(1000); parallel_for( blocked_range<int>(0, 2000), Update()); return 0; }