猿问

POSIX线程和信号

我一直在试图了解如何POSIX线程和POSIX信号相互作用的复杂性。我特别感兴趣:

  • 控制信号传递到哪个线程的最佳方法是什么(假设它首先不会致命)?

  • 告诉另一个线程(实际上可能很忙)信号到达的最佳方法是什么?(我已经知道,使用信号处理程序中的pthread条件变量是一个坏主意。)

  • 如何安全处理将发生信号的信息传递给其他线程?这是否需要在信号处理程序中发生?(我通常不希望杀死其他线程;我需要一种更巧妙的方法。)

作为我为什么要这样做的参考,我正在研究如何将TclX包转换为支持线程,或者将其拆分并至少使一些有用的部件支持线程。信号是那些特别令人感兴趣的部分之一。


aluckdog
浏览 454回答 3
3回答

呼如林

根据POSIX标准,所有线程在系统上应以相同的PID出现,并且使用pthread_sigmask()可以为每个线程定义信号阻止掩码。由于只允许为每个PID定义一个信号处理程序,因此我更喜欢在一个线程中处理所有信号,并pthread_cancel()在需要取消正在运行的线程时发送。这是首选方法,pthread_kill()因为它允许为线程定义清理功能。在某些较旧的系统上,由于缺少适当的内核支持,正在运行的线程可能具有与父线程的PID不同的PID。有关在Linux 2.4上使用linuxThreads处理信号的信息,请参见常见问题解答。

侃侃尔雅

到目前为止,我在哪里:信号来自不同的主要类别,其中一些通常通常应该终止进程(SIGILL),而某些则永远不需要做任何事情(SIGIO;更容易直接进行异步IO)。这两个类无需采取任何措施。有些信号不需要立即处理。像SIGWINCH这样的东西可以排队直到方便为止(就像X11中的事件一样)。棘手的是那些您想通过中断正在执行的操作来对它们做出响应,而又不会消灭线程的程度。特别是,在交互模式下的SIGINT应该使事物响应。我还有需要整理signalVS sigaction,pselect,sigwait,sigaltstack,和一大堆其他位和POSIX(和非POSIX)API的作品。
随时随地看视频慕课网APP
我要回答