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

时间:2013-12-22 11:14:20

标签: multithreading pthreads signals posix

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

2 个答案:

答案 0 :(得分:5)

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

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

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


更新

当需要在多线程环境中的常规基础上执行信号处理时,一种有趣的方法是将所有信号委托给一个单独的线程,除了等待信号使用sigwait()到达之外别无其他。

这样做:

  1. 在“主”线程中使用pthread_sigmask()之前根据您要处理的信号设置信号掩码。
  2. 然后创建线程来处理信号。
  3. 然后再次使用pthread_sigmask()阻止“主”线程中的所有信号。
  4. 最后创建所有其他主题。
  5. 结果是在1下指定的所有信号都将转到在2下创建的线程。所有其他线程都不会接收在1下指定的任何信号。

答案 1 :(得分:0)

pthread_sigmask()正是您所需要的。仅允许在应该捕获此信号的线程中进行SIGINT处理。