如何在Linux中命名一个线程?

use*_*876 39 c c++ linux multithreading

我有一个用C/C++编写的多线程Linux应用程序.我为我的线程选择了名字.为了帮助调试,我希望这些名称在GDB,"top"等中可见.这是可能的,如果是这样,如何?

(有很多理由知道线程名称.现在我想知道哪个线程占用了50%的CPU(由'top'报告).而且在调试时我经常需要切换到不同的线程 - 目前我必须做" thread apply all bt"然后查看回溯输出页面以找到正确的线程).

视窗解决方案就在这里 ; 什么是Linux?

Fus*_*awn 43

Posix线程?

这显然不会编译,但它会让你知道去哪里打猎.我甚至不确定它是正确的PR_命令,但我认为它是.有一阵子了...

  #include <sys/prctl.h>
  prctl(PR_SET_NAME,"<null> terminated string",0,0,0)
Run Code Online (Sandbox Code Playgroud)

  • 这很有效,谢谢!文档说PR_SET_NAME设置进程名称; 但该文档是错误的 - 它确实设置了线程名称.现在"top"和"ps -L"显示线程名称. (6认同)
  • 进一步调查显示,busybox的"top"和"ps"不报告线程名称.您需要"procps"包中的完整版本. (2认同)

lot*_*har 14

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

BSD Unix也有一个pthread_set_name_np调用.

否则,你可以使用使用prctl由Fusspawn提及.

  • 在Linux上,它被称为`pthread_setname_np`,它被添加到glibc 2.11.2中. (10认同)
  • [这个](http://stackoverflow.com/questions/2369738/can-i-set-the-name-of-a-thread-in-pthreads-linux)可能是关于这个主题的最详细的答案. (2认同)