2012-12-01 20 views
15

OMPクリティカルセクション内にC++例外をスローすることが安全かどうかと思います。ompクリティカルセクション内でのC++例外のスロー

#pragma omp critical (my_critical_section) 
{ 
    ... 
    throw my_exception("failed") 
    ...  
} 

g ++は文句を言わない。私はそれがクリティカルセクション内にreturnステートメントについて文句を言うので困惑しています。これは、エラーを返します:私はそう

#pragma omp critical (my_critical_section) 
{ 
    ... 
    return; 
    ...  
} 

を書くときinvalid exit from OpenMP structured blockは、なぜそれが例外でクリティカルセクションを残してOKですが、return文でそれを残して OK ではないでしょうか?

答えて

17

いいえ、例外があるクリティカルセクションを離れることはできません。 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構造(parallelsectionmastersingleforcriticaltaskなど)の中にスローされた場合、実行は、同じ構文内と同じスレッドことを再開しなければならないこと例外をキャッチする必要があります。この制限を違反すると、準拠しない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単にブロックの底部の落下とは異なり、ブロックの分岐を構成する。

関連する問題