【问题标题】:POSIX API call to list all the pthreads running in a processPOSIX API 调用列出进程中运行的所有 pthread
【发布时间】:2011-03-29 09:25:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: c linux pthreads posix


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢您的回复。我喜欢你的最后一个解决方案。我会调查一下。我宁愿避免阅读 /proc/ 的东西,主要是因为可移植性问题。
    【解决方案2】:

    您可以包装 ps -eLF(或另一个更仔细地读取您感兴趣的进程的命令)并阅读 NLWP 列以了解有多少线程正在运行。

    【讨论】:

    • 谢谢,但我宁愿进行 API 调用——如果存在的话。不过,我不知道如何使用此解决方案停止或销毁 pthread。
    • @msalvadores,是的,从程序中停止线程不适用于我的 hacky 答案——但您可以立即退出(2)进程,或者您的信号处理程序可以设置线程定期检查的全局变量;设置后,线程退出。
    【解决方案3】:

    鉴于线程在您的进程中,它们应该在您的控制之下。您可以将它们全部记录在数据结构中并进行跟踪。

    但是,除非得到适当的管理(或者您只能从一个线程创建和连接线程),否则这样做不会无竞争条件。

    您使用的库创建的任何线程都是他们的业务,您不应该弄乱他们的目录,否则库可能会损坏。

    如果你当然打算退出进程,你可以让线程继续运行,因为调用 exit() 会终止它们。

    请记住,强大的应用程序无论如何都应该是安全的,因此您不应依赖关闭行为来避免数据丢失等。

    【讨论】:

    • > 鉴于线程在您的进程中,它们应该在您的控制之下:这是错误的。库可以创建进程,如果您在另一个 VM 中运行,则无法控制线程创建。
    猜你喜欢
    • 2011-10-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2015-03-09
    相关资源
    最近更新 更多