Элегантная обработка исключений в OpenMP
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(...){}
вокруг каждого раздела и необходимости вручную захватить исключение.
Итак, мой вопрос: кто-нибудь знает более элегантный (менее многословный) способ сделать это (и если да, то как это выглядит)?