Tratamento de exceção elegante no OpenMP
O OpenMP proíbe o código que deixa o bloco openmp via exceção. Portanto, eu estou procurando uma boa maneira de obter as exceções de um bloco openmp com o propósito de relançá-lo no thread principal e lidar com um ponto posterior. Até agora, o melhor que consegui fazer é o seguinte:
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(); }
}
Enquanto isso funciona bem, relançando possíveis exceções da seção paralela assim que oThreadException
objeto é destruído, esta construção ainda é um pouco difícil de usar com a colocação de umtry {}catch(...){}
em torno de cada seção e ter que capturar manualmente a exceção.
Então, minha pergunta é: Alguém conhece uma maneira mais elegante (menos detalhada) de fazer isso (e, em caso afirmativo, como ela se parece)?