例外なしのキャンセル

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

関連情報