我在POSIX / Linux环境中有一个多线程应用程序-我无法控制创建pthread的代码。在某个时候,进程(pthread的所有者)接收到信号。
该信号的处理程序应中止,取消或停止所有pthread,并记录正在运行的pthread数。
我的问题是我找不到如何列出正在运行的所有pthread。
似乎没有任何可移植的方式枚举进程中的线程。
Linux具有pthread_kill_other_threads_np,看起来像是原始的纯用户级pthreads实现的遗留物,该实现可能无法或无法像今天所记录的那样工作。它不会告诉您有多少线程。
pthread_kill_other_threads_np
通过查找/proc/self(或对于其他过程,/proc/123)可以获得很多有关过程的信息。尽管许多unice都有一个具有该名称的文件或目录,但是布局是完全不同的,因此任何使用的代码/proc都是特定于Linux的。的文件/proc是Documentation/filesystems/proc.txt在内核源代码。特别是,/proc/self/task每个线程都有一个子目录。子目录的名称是LWP id。不幸的是,[1][2][3]似乎没有一种将LWPID与pthreadID关联的方法(但是gettid(2)如果您使用它,则可以得到自己的线程ID)。当然,阅读/proc/self/task不是原子的。线程数量可以通过以下方式原子地获得/proc/self/status (但是,在您采取行动之前,它当然可能会发生变化)。
/proc/self
/proc/123
/proc
Documentation/filesystems/proc.txt
/proc/self/task
gettid(2)
/proc/self/status
如果从Linux pthreads获得的有限支持无法实现所需的功能,则另一种策略是发挥动态链接技巧,以将自己的pthread_create日志版本提供给以后可以检查的数据结构。
pthread_create