增强线程和信号处理

Posted

技术标签:

【中文标题】增强线程和信号处理【英文标题】:Boost thread and signal handling 【发布时间】:2014-05-27 07:10:08 【问题描述】:

我想知道如何使用 boost 线程捕获信号。我知道如何使用 pthreads 做到这一点,但在 boost 中找不到解决方案。

我想在线程中捕获错误异常信号,例如 - sigsegv 等,这样如果一个线程出现此错误,整个程序就不会崩溃。

我总是可以直接使用底层 pthread 库来执行此操作,但想知道boost::thread 中是否有可移植的方式来执行此操作。

【问题讨论】:

我喜欢为此使用 Boost Asio 的 signal_set(一些 examples of use can be found in my answers) 【参考方案1】:

您的进程在收到SEGV 信号后无法reliably 恢复执行。如果您的程序必须在这种情况下保持运行,请将有问题的代码隔离到一个单独的进程中并通过 IPC 进行通信。也就是说,在 boost-asio 库中提升 provides 一个很好地集成的 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 是的,这是一个不正确的假设。它可能有时起作用,但有时会失败,这就是您无法可靠地继续执行的原因。这就是未定义行为的定义。

以上是关于增强线程和信号处理的主要内容,如果未能解决你的问题,请参考以下文章

检查线程是不是为增强线程

线程池小计

切面 aop 笔记

Java多线程入门知识点梳理

图像处理和数据增强

从 boost::signals2 安全断开