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

标签 multithreading pthreads signals posix

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

最佳答案

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

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

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


更新:

当需要在多线程环境中定期执行信号处理时,一个有趣的方法是将所有信号委托(delegate)给一个单独的线程,除了使用 sigwait() 等待信号到达外什么都不做。 .

这样做:

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

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

关于multithreading - 多线程服务器,信号处理。 POSIX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20728773/

相关文章:

java - ExecutorService 类型中的方法 invokeAll 不适用于参数错误

java - 线程上下文切换是如何完成的?

java - 为什么 BufferedReader 的 2 个引用在这里不独立运行?

c - malloc mongoose webserver http post body 并将其传递给线程

c - kill 和 signal 的准确性如何?

c - 如何避免信号处理程序中的竞争条件

c++ - 在 Python 中扩展的 C++ 类中的段错误回调问题

c++ - 与线程池中的 boost::function 使用相关的崩溃

c++ - 结构中的 vector 不会让我 push_back

c - 持久信号处理