答案1
从较大的进程中杀死单个线程通常是非常危险的。该线程可能:
- 正在修改与其他线程共享的某些可能损坏的状态
- 持有一些永远不会被释放的锁,导致锁无限期不可用
- ...或任何其他可能导致其他线程出错的事情。
一般来说,除了应用程序本身的管理和同步之外,终止单个线程是没有意义的。
答案2
你可能会使用tgkill(2)或者tkill
在你的 C 程序中(你需要使用系统调用(2)) 但你不想。从你的程序内部你可以使用pthread_kill(3)- 这很少有用。
(我完全不知道tgkill
or tkill
- 例如在线程上使用SIGKILL
or - 会产生什么影响)SIGTERM
这并行线程(7)库使用低级的东西(包括一些信号(7)-沙未来纺织(7)-s 等等……;也可以看看NPTL(7)),如果你原始杀死(用tkill
或tgkill
)某个单独的线程,你的进程将处于某种错误的状态(所以未定义的行为)因为一些内部不变量会被破坏。
因此,请研究数据包接收器程序的文档并寻找其他方法。如果是自由软件,研究它的源代码并改进它。
仔细阅读信号(7)和信号安全(7)。信号旨在发送到进程(通过杀死(2))并在线程中处理。
在实践中,信号和线程并不能很好地结合在一起。读一些线程教程。
一个常见的技巧,在编写多线程程序时(并且想要处理外部的像 ) 这样的信号SIGTERM
是使用管道(7)到你自己的流程和民意调查(2)该管道位于其他线程中(您也可以考虑 Linux 特定的信号fd(2)),带有信号处理程序写(2)- 将一个或几个字节放入该管道中。这个众所周知的技巧在中得到了很好的解释Qt 文档(即使没有 Qt,您也可以在自己的程序中使用它)。
答案3
SIGKILL
您可以为您知道未使用且不会被阻止/忽略的另一个信号安装一个处理程序,而不是发送(例如SIGSYS
)。在此处理程序中,您可以调用- 与常规或函数syscall(SYS_exit, 0)
相反,系统调用仅终止当前线程(LWP) - 整个进程将通过系统调用终止。exit(int)
_exit(int)
exit
exit_group
您可能会考虑调用pthread_exit(...)
而不是系统调用,但此函数不是异步安全的,因此调用它可能会导致进程出现段错误。
其他答案中有关强制终止线程的所有警告均适用。