c - POSIX API 调用以列出进程中运行的所有 pthreads

标签 c linux pthreads posix

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

该信号的处理程序应该中止、取消或停止所有 pthreads 并记录有多少 pthreads 正在运行。

我的问题是我找不到如何列出进程中运行的所有 pthreads 的方法。

最佳答案

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

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 版本以记录到数据结构您可以事后检查。

关于c - POSIX API 调用以列出进程中运行的所有 pthreads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34068843/

相关文章:

c++ - 如何打印 pthread_t

c - 使用 pthreads 的段错误

c - 上一个关于链表和堆栈如何工作的问题

c - 如何在 "variable name"中使用空格?

c - 将值分配给在结构中启动的二维数组会导致无限循环

c - 哪种循环配置将花费更多时间运行?

c++ - GDB 显示损坏的指令地址偏移量

c - 全局变量未更新 pthread

linux - grep 如何知道它正在写入输入文件?

linux - "cat"命令在从 Linux 设备驱动程序读取时终止