例外なしのキャンセル#
アルゴリズムをキャンセルしますが、例外をスローしない場合は、式 current_context()->cancel_group_execution() を使用します。current_context() は、現在のスレッドで実行中のタスクがある場合、その task_group_context* を参照します。cancel_group_execution() を呼び出すと、task_group_context 内のすべてのタスクがキャンセルされます。詳細については、キャンセルとネストされた並列処理で説明されています。このメソッドは、実際にキャンセルが発生した場合は true を返し、task_group_context がすでにキャンセルされている場合は false を返します。
以下の例は、current_context()->cancel_group_execution() を使用する方法を示しています。
#include "oneapi/tbb.h"
#include <vector>
#include <iostream>
using namespace oneapi::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( current_context()->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;
}