インテル® スレッディング・ビルディング・ブロック (インテル® TBB) は、タスクツリーの論理パスに沿って例外を伝えます。これらのパスはスレッドのスタックをまたいでいるため、スタック間で例外を移動できなければなりません。
タスクで例外がスローされると、インテル® TBB ランタイム内で次のようにキャッチされ、処理されます。
- タスクのキャンセルグループがすでにキャンセルされている場合は、例外は無視されます。
- その他の場合は、例外またはそれに類似するものがキャプチャーされ、グループがキャンセルされます。
- キャプチャーされた例外は、グループのすべてのタスクが完了するか、キャンセルされた後に、キャンセルグループのルートから再スローされます。
次の条件が両方とも真の場合は、オリジナルの例外がキャプチャーされます。
- タスクの task_group_context が、TBB_USE_CAPTURED_EXCEPTION=0 でコンパイルされた翻訳単位で作成されている。
- インテル® TBB ライブラリーが、C++11 の std::exception_ptr 機能をサポートするコンパイラーでビルドされている。
その他の場合は、次のように、オリジナルの例外に類似する x がキャプチャーされます。
- x が tbb_exception の場合は、x.move() でキャプチャーされます。
- x が std::exception の場合は、tbb::captured_exception(typeid(x).name(),x.what()) としてキャプチャーされます。
- その他の場合は、x は name() および what() で実装固有の値とともに tbb::captured 例外としてキャプチャーされます。