2013-12-22 51 views
2

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

+0

的http://计算器.com/a/18314115/412080 –

回答

5

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

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

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


更新:

当信号处理需要在多线程环境定期基地进行,一个有趣的方法是将所有信号委托给一个单独的线程里什么也不做,但等待信号使用sigwait()抵达。

要做到这一点:

  1. 设置信号屏蔽按你想在“主”线程别的之前使用pthread_sigmask()来处理信号。
  2. 然后创建线程来处理信号。
  3. 然后再次使用pthread_sigmask()来阻止来自“主”线程中的1.的所有信号。
  4. 最后创建所有其他线程。

的结果将是在1规定的所有信号会去下2创建线程。所有其他线程将不会收到任何下1规定的信号..

+0

这里的问题是我每次获得连接时都会创建一个新线程,因此绝不可以在创建_all_线程后解锁信号 – darenn

+0

@darenn:请参阅我的更新答案。 – alk

+0

另一个问题是..我的服务器在运行{msgrcv()...}循环运行。当我捕捉到信号时,我将运行设置为false,但主线程仍然卡在msgrcv上。有什么办法可以处理,除了销毁ipc队列并检查EIDRM错误吗? – darenn

0

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

+0

这种方法引入了线程创建和线程调用'pthread_sigmask()'之间的时间竞争。 – alk

+0

@alk是的,但这不是一个真正的问题,并且很容易以多种方式解决。 – Netch