3

有一个守护进程有两个线程:th1,th2。th2 使用read(2).

如果我用 杀死守护进程SIGTERM,th1 会捕获并处理信号(设置终止标志),然后调用守护进程析构函数,它会调用pthread_kill(th2, SIGTERM). 但是,第二个线程没有接收到SIGTERM,所以它没有被杀死(当套接字接收到数据并从 中取出时read(),它完成了执行,因为已经设置了终止标志)。

如果我调用pthread_kill(th2, SIGUSR2), 然后pthread_kill(th2, SIGTERM),一切都会正确完成。因此,UNIX 似乎因此不允许发送相同的信号。

这种行为是否取决于操作系统?我们能否确保指定线程SIGTERM从另一个线程接收?

4

2 回答 2

5

Unix 确实允许向一个进程发送多个连续的信号,尽管如果信号被发送得太近,或者在传递已经挂起的信号之前向进程发送了一个额外的信号,那么多个信号可以连接成一个信号事件.

还要记住,虽然pthread_kill()将信号发送到要处理的给定线程,但信号的实际处理具有全局效果(即,信号处理程序是每个进程的,而不是每个线程的)。

您可能还想研究显式调用pthread_cancel(),因为read()它是一个有效的取消点。如果需要,您可以添加取消处理程序,如果您使用的函数不是取消安全的,则可以阻止线程的取消状态。pthread_cancel() 您可以在此处阅读一些使用技巧。

于 2011-08-03T18:17:18.273 回答
1

一种相对老派但有效的方法是使用 select() 和管道将信号重新分配给所有线程。(您在阻塞句柄和管道读取句柄上选择())。

于 2011-08-03T18:38:41.210 回答