インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド

例外処理

インテル® Cilk™ Plus では、C++ 例外処理のセマンティクスを厳密に再現しようとします。 つまり、一般に例外が解決されるまでの間は並列化が制限されることになるので、例外処理においてプログラムが並列性に依存しないようにする必要があります。 次に、例外処理のロジックを示します。

例外をスローしても、例外がスローされたストランドの既存の子ストランドや同レベルのストランドはアボートしません。通常どおりに実行され、完了します。

try ブロック に cilk_spawncilk_sync が含まれている場合は、try ブロックの初めと終わりに (デストラクターが呼び出された後に) 暗黙的な cilk_sync があります。 例外により try ブロック、関数ブロック、または cilk_for 本体を終了する前に同期が自動的に実行されます。 (cilk_for 内の同期スコープは、同じループ内のスポーンに制限されます。) catch ブロックの実行を開始する時点で、関数にアクティブな子はありません。 このような暗黙的な同期は、プログラムのシリアル実行で同じ catch 節を実行した場合と同じになるようにします。

暗黙的な同期は、プログラムの並列性の妨げとなることがあります。特に、次のような try ブロックの前の暗黙的な同期は、try ブロックの前にあるスポーンを時期尚早に同期してしまう可能性があります。

void func() {
   cilk_spawn f();
   try { // oops! implicit sync prevents parallel execution of f()
     cilk_spawn g();
     h();
   }
   catch (...) {
     // Handle exceptions from g() or h(), but not f()
   }
}

このことが問題になる場合は、暗黙的な同期を抑止する方法がいくつかあります。

Windows* 構造化例外処理

Microsoft* Windows* の構造化例外処理 (SEH) を使用する場合には (特に /EHa コンパイラー・オプションと C/C++ の __try、__except、__finally__leave 拡張では)、いくつかの制限があります。 スチールが行われた後、対応する cilk_sync の前に SEH 例外がスローされると、SEH は失敗します。 この場合、ランタイムは状況を認識し、プログラムを終了して、適切なエラーコードを返します。


このヘルプトピックについてのフィードバックを送信