POSIX API调用列出进程中运行的所有pthread

我在POSIX / Linux环境中有一个multithreading应用程序 – 我无法控制创buildpthread的代码。 在某些时候,进程(pthreads的所有者)接收到一个信号。

该信号的处理程序应该中止,取消或停止所有的pthread,并logging运行的pthread数量。

我的问题是,我无法find如何列出正在运行的所有pthread。

Solutions Collecting From Web of "POSIX API调用列出进程中运行的所有pthread"

似乎没有任何可移植的方式来枚举进程中的线程。

Linux有pthread_kill_other_threads_np ,看起来像原来纯粹的用户态pthreads实现中的剩余部分,可能或不可能像现在所记载的那样工作。 它不会告诉你有多少线程。

通过查看/proc/self (或者对于其他进程, /proc/123 ),您可以获得有关进程的大量信息。 尽管许多unice都有一个带有这个名字的文件或者目录,但是这个布局是完全不同的,所以任何使用/proc代码都是Linux专用的。 /proc Documentation/filesystems/proc.txt位于内核源Documentation/filesystems/proc.txt中。 特别是, /proc/self/task每个线程都有一个子目录。 子目录的名称是LWP ID; 不幸的是, [1] [2] [3]似乎没有将LWP ID与pthread ID相关联的方法(但是如果你工作的话,你可以用gettid(2)来获得你自己的线程ID)。 当然,阅读/proc/self/task不是原子的; 线程的数量可以通过/proc/self/status (但是在你采取行动之前它可能会改变)。

如果用Linux pthreads获得的有限支持无法达到目标,另一种策略是使用动态链接技巧来提供您自己的pthread_create版本,然后将其记录到数据结构中,以便日后检查。

你可以包装ps -eLF (或者更接近你刚刚感兴趣的进程的另一个命令),并读取NLWP列来找出有多少线程正在运行。

鉴于线程正在处理中,它们应该在您的控制之下。 您可以将它们全部记录在数据结构中并保持跟踪。

然而,这样做不会是无竞争条件的,除非它被适当的管理(或者你只能从一个线程创建和连接线程)。

你使用的库创建的任何线程是他们的业务,你不应该搞乱他们的目录,或者库可能会中断。

如果你打算退出进程,你可以让线程继续运行,因为调用exit()会终止它们。

请记住,强大的应用程序应该是安全的,所以你不应该依赖关闭行为来避免数据丢失等。