【问题标题】:How to name a thread in Linux? [duplicate]如何在 Linux 中命名线程? [复制]
【发布时间】:2010-10-21 03:44:01
【问题描述】:

我有一个用 C/C++ 编写的多线程 Linux 应用程序。我有chosen names for my threads。为了帮助调试,我希望这些名称在 GDB、“top”等中可见。这可能吗?如果可以,如何?

(有很多reasons to know the thread name。现在我想知道哪个线程占用了 50% 的 CPU(由 'top' 报告)。调试时我经常需要切换到不同的线程 - 目前我必须执行“thread apply all bt”然后查看回溯输出页面以找到正确的线程)。

Windows solution is here; Linux 是什么?

【问题讨论】:

标签: c++ c linux multithreading


【解决方案1】:

Posix 线程?

这显然不会编译,但它会让你知道去哪里打猎。我什至不确定它是正确的PR_ 命令,但我认为它是正确的。好久不见……

  #include <sys/prctl.h>
  prctl(PR_SET_NAME,"<null> terminated string",0,0,0)

【讨论】:

  • 成功了,谢谢!文档说 PR_SET_NAME 设置进程名称;但是该文档是错误的-它确实设置了线程名称。现在 "top" 和 "ps -L" 显示线程名称。
  • 很高兴它起作用了,我不确定它是否是正确的常量,:)
  • 我一直根据启动函数来识别线程,如线程的堆栈跟踪中所示。很高兴知道有一个干净的选择。
  • 进一步调查显示,busybox 的“top”和“ps”不报告线程名称。您需要“procps”包中的完整版本。
  • 您可以使用 c 开关强制“ps”显示该名称(例如 ps Hcx)。
【解决方案2】:

如果您使用像 ACE 这样的库,Thread 可以在创建新线程时指定线程名称。

BSD Unix 也有一个pthread_set_name_np 调用。

否则,您可以使用 Fusspawn 提到的prctl

【讨论】:

  • 在 Linux 上它被称为 pthread_setname_np,它是在 glibc 2.11.2 中添加的。
  • This 可能是该主题最详细的答案。
猜你喜欢
  • 2011-08-10
  • 2015-08-15
  • 2013-11-24
  • 2011-02-23
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2016-04-09
相关资源
最近更新 更多