例外なしのキャンセル

例外なしのキャンセル#

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