【问题标题】:Elegant exceptionhandling in OpenMPOpenMP 中的优雅异常处理
【发布时间】:2012-08-06 12:43:52
【问题描述】:

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(...){} 并且必须手动捕获例外。

所以我的问题是:有谁知道更优雅(不那么冗长)的方式来做到这一点(如果有,它是什么样子的)?

【问题讨论】:

  • 当两个或多个线程抛出异常(可能不同)时,您将如何处理?
  • @HristoIliev:忽略其中一个(因为无论如何我不能抛出一个异常),只重新抛出最后一个。
  • 从析构函数中抛出是非法的(我使用了一个这样做的库,它给我带来了很多麻烦,直到我弄清楚为什么我的应用程序在没有捕获异常的情况下一直中止)。您必须在并行部分之后致电except.Rethrow()。如果发生异常时您不想执行的并行部分之后有顺序代码,这会更好。
  • 我认为使用std::mutex 可能会导致未定义的行为。见stackoverflow.com/a/53516587/5861244。但是,#pragma omp critical 应该在这里工作。

标签: c++ exception-handling c++11 openmp


【解决方案1】:

您可以利用更多的 C++11 工具来稍微清理一下语法。将此可变成员函数添加到您的 ThreadException 类中:

class ThreadException {

    // ...

    template <typename Function, typename... Parameters>
    void Run(Function f, Parameters... params)
    {
        try 
        {
            f(params...);
        }
        catch (...)
        {
            CaptureException();
        }
    }
 };

然后在 OpenMP 构造内部调用时,使用如下 lambda 函数:

ThreadException e;

#pragma omp parallel for
for (int i = 0; i < n; i++)
{
    e.Run([=]{
        // code that might throw
        // ...
    });
}
e.Rethrow()

【讨论】:

  • 出于某种奇怪的原因,我没有考虑将仿函数传递给 Exception 类,因此感谢您的建议。
  • 另外,请小心从析构函数调用 Rethrow() - 这会崩溃并严重烧毁!
猜你喜欢
  • 1970-01-01
  • 2015-04-10
  • 2017-03-04
  • 1970-01-01
  • 2014-07-10
  • 2016-07-30
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多