いいえ、例外があるクリティカルセクションを離れることはできません。 g++
はこの場合は文句を言いませんが、暗黙的にクリティカルセクションのブロックに暗黙的にtry/catch
を挿入します。たとえば、次のコード:
:暗黙の内蔵のキャッチオールハンドラかなり無様終了で
<<<eh_must_not_throw (terminate)>>>
結果を到達
#pragma omp critical (my_crit)
__builtin_GOMP_critical_name_start (&.gomp_critical_user_my_crit);
try
{
D.20639 = __cxa_allocate_exception (4);
try
{
MEM[(int *)D.20639] = 3;
}
catch
{
__cxa_free_exception (D.20639);
}
__cxa_throw (D.20639, &_ZTIi, 0B);
}
catch
{
<<<eh_must_not_throw (terminate)>>>
}
__builtin_GOMP_critical_name_end (&.gomp_critical_user_my_crit);
:
#pragma omp critical (my_crit)
{
throw 3;
}
はにGCC 4.7のOpenMPのプロセッサによって下げます
暗黙のtry/catch
は、外側のtry/catch
構成体の存在にかかわらず挿入される、すなわち、ex部はcritical
セクションを決して出ることはありません。
OpenMPの標準義務付け、例外はほとんどのOpenMP構造(parallel
、section
、master
、single
、for
、critical
、task
など)の中にスローされた場合、実行は、同じ構文内と同じスレッドことを再開しなければならないこと例外をキャッチする必要があります。この制限を違反すると、準拠しないOpenMPコードが発生し、g++
は、すべてのコンストラクト内に終了ハンドラを含むtry/catch
ブロックを挿入するだけで、適合を強制します。
return
ステートメントが存在する場合、OpenMPではとしてC/C++でstrcuturedブロックを定義エラーとして:
For C/C++, an executable statement, possibly compound, with a single entry at the top and a single exit at the bottom, or an OpenMP construct.
また、(すべての言語用):明らか
The point of exit cannot be a branch out of the structured block.
return
単にブロックの底部の落下とは異なり、ブロックの分岐を構成する。