例外とキャンセル

例外とキャンセル#

oneAPI スレッディング・ビルディング・ブロック (oneTBB) は、例外とキャンセルをサポートします。oneTBB アルゴリズム内のコードが例外をスローすると、通常は次の手順が発生します。

  1. 例外がキャプチャーされます。アルゴリズム内のその他の例外は無視されます。

  2. アルゴリズムはキャンセルされます。保留中の反復は実行されません。oneTBB 並列処理が内部でネストされている場合、キャンセルとネストされた並列処理で説明されているように、ネストされた並列処理もキャンセルされる可能性があります。

  3. アルゴリズムのすべてが停止すると、アルゴリズムを呼び出したスレッドで例外がスローされます。

コンパイラーがこの機能をサポートするようになると、oneTBB の将来のバージョンでは元の例外がスローされる可能性があります。そのため、コードがどちらのタイプの例外もキャッチできることを確認してください。以下は例外処理の例を示しています。

#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 ) 
            Data.at(i) += 1; 
    } 
}; 

int main() { 
    Data.resize(1000); 
    try { 
        parallel_for( blocked_range<int>(0, 2000), Update()); 
    } catch( out_of_range& ex ) { 
        cout << "out_of_range: " << ex.what() << endl; 
    } 
    return 0; 
}

parallel_for は、1000 要素のみを持つベクトルの 2000 要素を反復処理しようとします。したがって、式 Data.at(i) は、アルゴリズムの実行中に例外 std::out_of_range をスローすることがあります。例外が発生すると、アルゴリズムはキャンセルされ、parallel_for の呼び出し元で例外がスローされます。