多线程服务器,信号处理.POSIX

dar*_*enn 2 multithreading posix signals pthreads

我在多线程服务器中处理信号处理时遇到问题.我为每个连接创建一个线程,但我希望有一个选项来使用SIGINT终止服务器.然而,当其中一个线程捕获到信号时,事情会变得很糟糕.有没有办法可以阻止线程获取除主线程之外的信号?

alk*_*alk 5

线程从创建它的线程继承其信号掩码.

假设创建线程是"主"线程,您可能希望在创建线程之前阻止所有相关信号,并且在完成代码之后,解锁创建线程中的信号.

修改POSIX定义的线程信号掩码pthread_sigmask().


更新:

当需要在多线程环境中的常规基础上执行信号处理时,一种有趣的方法是将所有信号委托给单独的线程,除了等待信号到达之外什么也不做sigwait().

为此:

  1. 根据您想要处理的信号pthread_sigmask(),在"主"线程之前设置信号掩码.
  2. 然后创建线程来处理信号.
  3. 然后pthread_sigmask()再次使用"主"线程中阻止来自1.的所有信号.
  4. 最后创建所有其他线程.

结果是在1.下指定的所有信号都将转到在2下创建的线程.所有其他线程将不会接收在1下指定的任何信号.