【问题标题】:How do I count the number of running threads (pthreads)?如何计算正在运行的线程数(pthreads)?
【发布时间】:2011-12-16 07:52:48
【问题描述】:

如果我搜索计算应用程序的线程数,所有答案都涉及外部程序,例如top。我想计算应用程序本身的线程数。

我无法在创建线程时添加代码,因为它发生在不可变库中。

我看不懂/proc

这是一个在几个不同的 Unices 上运行的 C/pthreads 程序。

【问题讨论】:

  • "man ps" 并查看“线程”。例如“ps -TF -p $pid”,如果你需要远程控制,我猜你可以通过 ssh 运行。
  • 这必须由我的应用程序完成,而不是通过调用另一个应用程序。
  • Pthreads 没有用于计算线程的 API,它甚至不能保证您获得多个内核线程。你可以ptrace(2)你的进程,但这是一个你只能用于调试的hack。
  • pthreads 设计的一个主要点是它可以完全透明(对程序的其余部分)一个函数是否使用多个线程实现。如果您尝试计算线程数,那么您可能做错了什么。对于您自己创建的线程,您可以使用信号量(在启动时发布,退出时等待)或您在互斥锁控制下修改的计数器安全地对它们进行计数。
  • “完全透明”?我不买那个。这意味着没有关键部分,没有gettid...

标签: c multithreading unix pthreads posix


【解决方案1】:

如果你看不懂/proc,那你就有点麻烦了,除非你的程序与另一个读取/proc的程序通信

如果您出于可移植性的考虑不想阅读/proc,您可以使用一个抽象化的库,就像libproc 所做的那样

【讨论】:

  • 感谢 libproc 提示,但它在这种锁定的环境中不起作用。引入新图书馆是禁忌。
【解决方案2】:

您可以为 pthread_create 编写一个小型包装器,用于计算创建的线程并在链接到不可变库后链接到该包装器。

【讨论】:

  • 但是库不会调用包装器...?
  • 库调用 pthread_create。您可以在链接期间提供 pthread_create 实现,在链接时或使用 dmalloc 和朋友知道的 LD_PRELOAD 技巧。
  • @spraff,如果你链接到你自己的库,它会被调用。
【解决方案3】:

使用顶部 -H。但是很可能,如果您无法阅读 proc,那么 top 无论如何都无法工作。如果是这样,没有简单的方法,这取决于您的特定系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2020-01-02
    • 2023-03-17
    相关资源
    最近更新 更多