【问题标题】:Catching Exceptions with Pthreads使用 Pthread 捕获异常
【发布时间】:2013-03-03 19:21:36
【问题描述】:

虽然这个问题不仅限于 OpenKinect 库,但它是我能想出的用来展示它的最佳示例。

在 OpenKinect 的 C++ Wrapper 中,每当出现问题时,它都会引发 runtime_error 异常。此示例来自 libfreenect.hpp。线程是在类的构造函数中创建的。

// Do not call directly, thread runs here
void operator()() {
    while(!m_stop) {
        if(freenect_process_events(m_ctx) < 0) throw std::runtime_error("Cannot process freenect events");
    }
}

static void *pthread_callback(void *user_data) {
    Freenect* freenect = static_cast<Freenect*>(user_data);
    (*freenect)();
    return NULL;
}

我的问题很简单:是否有可能以某种方式捕获这些错误并处理它们?

通常,我会处理异常,或者重写代码:我不喜欢程序因为异常而崩溃,如果我知道它们可能会发生,我宁愿干净地处理它们。有一些库做了类似的事情,我无法重写,因此我来问这个问题。

【问题讨论】:

  • 为什么不能处理异常?为什么不尝试/捕获'(*freenect)();'打电话?
  • 重点是这是图书馆的一部分。虽然这个是开源的并且可以更改,但在其他情况下我无法更改它。所以我只是想知道是否可以使用 pthreads 捕获另一个线程的抛出。
  • 不直接,不。异常是基于堆栈的机制,因此是特定于线程的。如果您没有在 pthreads 中捕获它们,线程将被静默终止。将异常传达给其他线程将需要在 catch{} 中进行线程间通信;

标签: c++ pthreads openkinect


【解决方案1】:

您必须更清楚地定义线程的职责。我猜它通过某种管道或并发队列将一些消息提供给其他线程。在这种情况下,只需更改您的消息类以存储异常信息(std::exception_ptr)。当你访问消息中的数据时,首先检查是否包含异常;如果是,请调用 std::rethrow_exception()。

在 std::future(); 中使用了类似的机制;要么你得到()承诺的价值,要么在尝试这样做时引发异常,这来自另一个线程。搜索 std::async() 示例以查看它的实际效果。

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 2013-03-24
    • 2012-10-20
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多