我在POSIX / Linux环境中有一个多线程应用程序 - 我无法控制创建pthread的代码。在某些时候,进程 - pthreads的所有者 - 收到一个信号。
该信号的处理程序应该中止,取消或停止所有pthread并记录运行的pthreads数量。
我的问题是我找不到如何列出正在运行的所有pthread。
答案 0 :(得分:22)
似乎没有任何可移植的方法来枚举进程中的线程。
Linux有pthread_kill_other_threads_np
,它看起来像是原始纯用户态pthreads实现的剩余部分,可能会或可能不会像今天所记录的那样工作。它没有告诉你有多少线程。
通过查看/proc/self
(或其他流程/proc/123
),您可以获得有关流程的大量信息。虽然许多unices有一个具有该名称的文件或目录,但布局完全不同,因此使用/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
版本,该版本会记录到您可以检查的数据结构之后。
答案 1 :(得分:0)
你可以包装ps -eLF
(或者更密切地读取你感兴趣的进程的另一个命令)并阅读NLWP
列以找出正在运行的线程数。
答案 2 :(得分:-5)
鉴于线程在你的进程中,它们应该在你的控制之下。您可以在数据结构中记录所有这些内容并跟踪。
但是,这样做不会没有竞争条件,除非它被适当地管理(或者你只是从一个线程创建和连接线程)。
您使用的库创建的任何线程都是他们的业务,您不应该弄乱它们的目录,否则库可能会中断。
如果您打算退出当然的过程,您可以让线程保持运行,因为调用exit()会终止它们。
请记住,健壮的应用程序无论如何都应该是崩溃安全的,因此您不应该依赖关闭行为来避免数据丢失等。