我在多线程服务器的信号处理方面遇到了问题。我为每个连接创建一个线程,但我希望有一个选项用于使用SIGINT终止服务器。但是当其中一个线程捕获信号时,情况会变得很棘手。有没有一种方法可以阻止线程获取信号,除了主线程之外?
我在多线程服务器的信号处理方面遇到了问题。我为每个连接创建一个线程,但我希望有一个选项用于使用SIGINT终止服务器。但是当其中一个线程捕获信号时,情况会变得很棘手。有没有一种方法可以阻止线程获取信号,除了主线程之外?
一个线程继承其创建者的信号掩码。
假设创建线程是“主”线程,您可能希望在创建线程之前阻塞所有相关信号,在代码完成后取消阻塞创建线程中的信号。
要修改线程的信号掩码,POSIX定义了 pthread_sigmask()
。
更新:
当在多线程环境中需要定期执行信号处理时,一种有趣的方法是将所有信号委托给一个单独的线程,该线程除了使用 sigwait()
等待信号到达外不执行任何其他操作。
具体实现步骤如下:
pthread_sigmask()
设置与要处理的信号相对应的信号掩码。pthread_sigmask()
在 1. 中阻止所有信号在"主"线程中被处理。pthread_sigmask() 就是你需要的。只允许在一个特定的线程中处理 SIGINT 信号。
pthread_sigmask()
之间的时间。 - alk