POSIX API 调用列出进程中运行的所有 pthreads
- 2024-10-18 09:00:00
- admin 原创
- 61
问题描述:
我在 POSIX/Linux 环境中有一个多线程应用程序 - 我无法控制创建 pthreads 的代码。在某个时刻,进程(pthreads 的所有者)会收到一个信号。
该信号的处理程序应该中止、取消或停止所有 pthreads,并记录正在运行的 pthreads 数量。
我的问题是,我找不到如何列出进程中运行的所有 pthreads。
解决方案 1:
似乎没有任何可移植的方法来枚举进程中的线程。
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[3]似乎没有办法将 LWP id 与 pthread id 关联起来(但gettid(2)
如果您努力的话,您可以使用获取自己的线程 id)。当然,读取/proc/self/task
不是原子的;线程数可以通过原子方式获得/proc/self/status
(但当然在您对其采取行动之前它可能会发生变化)。
如果您无法通过 Linux pthreads 提供的有限支持实现您想要的效果,另一种策略是使用动态链接技巧来将您自己的版本pthread_create
记录到您之后可以检查的数据结构中。
解决方案 2:
您可以换行ps -eLF
(或使用另一个命令更紧密地读取您感兴趣的过程)并阅读该NLWP
列以找出正在运行的线程数。
解决方案 3:
鉴于线程位于您的进程中,它们应该在您的控制之下。您可以将所有线程记录在数据结构中并进行跟踪。
但是,除非得到适当的管理(或者您只从一个线程创建和加入线程),否则这样做不会产生竞争条件。
您使用的库创建的任何线程都是它们自己的事,您不应该弄乱它们的目录,否则库可能会崩溃。
当然,如果您打算退出该进程,那么您可以让线程继续运行,因为调用 exit() 会终止所有线程。
请记住,无论如何,强大的应用程序应该是防崩溃的,因此您不应该依赖关机行为来避免数据丢失等。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件