Elegancki wyjątek w OpenMP
OpenMP zabrania kodu, który pozostawia blok openmp za pomocą wyjątku. Dlatego szukam miłego sposobu na uzyskanie wyjątków z bloku openmp w celu ponownego wprowadzenia go do głównego wątku i obsługi w późniejszym czasie. Jak dotąd najlepsze, co mogłem wymyślić, to:
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(); }
}
Podczas gdy działa to dobrze, ponownie rzucając możliwe wyjątki z sekcji równoległej, gdy tylkoThreadException
obiekt jest zniszczony, konstrukcja ta jest jeszcze trochę niewygodna w użyciu przy wstawianiutry {}catch(...){}
wokół każdej sekcji i konieczności ręcznego przechwycenia wyjątku.
Więc moje pytanie brzmi: czy ktoś zna bardziej elegancki (mniej gadatliwy) sposób na zrobienie tego (a jeśli tak, jak to wygląda)?