【发布时间】:2011-03-29 09:25:33
【问题描述】:
我在 POSIX/Linux 环境中有一个多线程应用程序 - 我无法控制创建 pthread 的代码。在某个时刻,进程(pthread 的所有者)会收到一个信号。
该信号的处理程序应该中止、取消或停止所有 pthread 并记录有多少 pthread 在运行。
我的问题是我找不到如何列出所有在进程中运行的 pthread。
【问题讨论】:
我在 POSIX/Linux 环境中有一个多线程应用程序 - 我无法控制创建 pthread 的代码。在某个时刻,进程(pthread 的所有者)会收到一个信号。
该信号的处理程序应该中止、取消或停止所有 pthread 并记录有多少 pthread 在运行。
我的问题是我找不到如何列出所有在进程中运行的 pthread。
【问题讨论】:
似乎没有任何可移植的方式来枚举进程中的线程。
Linux 有pthread_kill_other_threads_np,它看起来像是原始纯用户态 pthreads 实现的遗留物,可能会也可能不会像今天记录的那样工作。它不会告诉你有多少线程。
您可以通过查看/proc/self(或者,对于其他进程,/proc/123)来获取有关您的进程的大量信息。尽管许多 unice 都有一个具有该名称的文件或目录,但布局完全不同,因此任何使用 /proc 的代码都是特定于 Linux 的。 /proc 的文档位于内核源代码中的 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() 会终止它们。
请记住,强大的应用程序无论如何都应该是安全的,因此您不应依赖关闭行为来避免数据丢失等。
【讨论】: