提升线程和信号处理

3
我想知道如何使用boost thread捕获信号。我知道如何使用pthread完成此操作,但是在boost中找不到解决方案。
我希望能够在线程中捕获错误异常信号,例如sigsegv等,以便如果一个线程发生错误,整个程序不会崩溃。
我可以直接使用底层的pthread库来完成此操作,但是想知道是否有一种可移植的方式在boost::thread中实现此操作。

我喜欢使用Boost Asio的signal_set来实现这个功能(一些使用示例可以在我的答案中找到:http://stackoverflow.com/search?tab=newest&q=user%3a85371%20signal_set)。 - sehe
1个回答

2
您的程序在收到 SEGV 信号后无法可靠地恢复执行。如果您的程序必须在这种情况下继续运行,请将有问题的代码隔离到一个单独的进程中,并通过 IPC 进行通信。话虽如此,boost 在 库中提供了一个很好集成的 signal_set 来处理信号。
void handler(
    const boost::system::error_code& error,
    int signal_number
    )
{
  if (!error)
  {
    // A signal occurred.
  }
}

...

// Construct a signal set registered for process termination.
boost::asio::signal_set signals(io_service, SIGINT, SIGTERM);

// Start an asynchronous wait for one of the signals to occur.
signals.async_wait(handler);

好的,我会研究一下boost::asio。但是你能否澄清一下 - “在接收到SEGV信号后,您的进程无法可靠地恢复执行”。引起SEGV的线程无法恢复,但其他线程可以继续。我将退出有问题的线程,让其他线程继续。这样做有错吗? - Rohit
1
@Rohit 是的,那是一个错误的假设。它有时可能有效,但其他时候会失败,这就是为什么您不能可靠地继续执行的原因。这就是“未定义行为”的定义。 - Sam Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接