OpenMP は、例外によって openmp ブロックを終了するコードを禁止します。したがって、メインスレッドで例外を再スローし、後で処理する目的で、openmp ブロックから例外を取得する良い方法を探しています。これまでのところ、私が思いついた最高のものは次のとおりです。
class ThreadException {
std::exception_ptr Ptr;
std::mutex Lock;
public:
ThreadException(): Ptr(nullptr) {}
~ThreadException(){ this->Rethrow(); }
void Rethrow(){
if(this->Ptr) std::rethrow_exception(this->Ptr);
}
void CaptureException() {
std::unique_lock<std::mutex> guard(this->Lock);
this->Ptr = std::current_exception();
}
};
//...
ThreadException except;
#pragma omp parallel
{
try {
//some possibly throwing code
}
catch(...) { except.CaptureException(); }
}
これはうまく機能し、オブジェクトが破棄されるとすぐに並列セクションから可能な例外を再スローしますが、この構成は、各セクションを囲んで手動で例外をキャプチャする必要がThreadException
あるため、使用するにはまだ少し扱いにくいです。try {}catch(...){}
だから私の質問は、これを行うためのよりエレガントな(冗長でない)方法を知っている人はいますか(もしそうなら、それはどのように見えますか)?