Elegante Ausnahmebehandlung in OpenMP
OpenMP verbietet Code, der den openmp-Block über eine Ausnahme verlässt. Daher suche ich nach einer guten Möglichkeit, die Ausnahmen von einem openmp-Block zu erhalten, um sie im Haupt-Thread erneut zu werfen und zu einem späteren Zeitpunkt zu verarbeiten. Bisher ist das Beste, was ich mir einfallen lassen konnte, das Folgende:
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(); }
}
Dies funktioniert zwar gut, wirft jedoch mögliche Ausnahmen aus dem parallelen Abschnitt zurück, sobald dieThreadException
Objekt zerstört ist, ist dieses Konstrukt noch ein bisschen unhandlich mit Putting a zu verwendentry {}catch(...){}
um jeden Abschnitt und müssen die Ausnahme manuell erfassen.
Meine Frage lautet also: Kennt jemand eine elegantere (weniger ausführliche) Methode, um dies zu tun (und wenn ja, wie sieht sie aus)?