【问题标题】:signal handler and library worker threads信号处理程序和库工作线程
【发布时间】:2014-03-07 17:51:23
【问题描述】:

我的应用程序的客户端代码是单线程的,但我使用的 TCP 套接字通信库可能创建从客户端应用程序的角度来看应该是透明的工作线程。但是,我有一个信号处理程序来捕获 SIGSEGV 错误,它试图打印堆栈跟踪,现在间歇性失败。

我想知道在进程内部创建工作线程这一事实是否可能会影响信号处理程序的执行?内核可以决定在某些工作线程中执行信号处理程序吗?如果是这样,是否有某种方法可以避免这种情况发生并强制信号处理程序始终在主进程线程上执行?

【问题讨论】:

标签: c++ linux multithreading signals


【解决方案1】:
  1. SIGSEGV 处理程序有一个固有的问题,即每个SEGV(除了人为的示例)都来自未定义的行为(更不用说意外的行为),程序之后所做的同样是未定义的。或者用更少的语言律师术语,你不知道什么是坏的。例如,如果您覆盖了堆,或者您在 SEGV 持有 malloc() 中的某些锁时,您的信号处理程序将无法工作。

  2. 在最好的情况下,让线程和信号处理程序一起工作并不容易。程序在线程化时对信号设置错误的容忍度要低得多(根据我的经验)。首先,确保您使用的是现代 API。 IE 不使用signal (2)。适当使用sigactionpthread_sigmask

  3. 请注意,有些信号(包括SIGSEGV)会传递给进程而不是线程。

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 1970-01-01
    • 2014-10-07
    • 2012-01-24
    • 2011-11-18
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    相关资源
    最近更新 更多