例外をスローしないでアルゴリズムをキャンセルするには、式 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;
}