我可以在pthreads / Linux中设置线程的名称吗?

有什么方法可以在Linux中设置线程的名称?

我的主要目的是debugging时会有帮助,而且如果通过/proc/$PID/task/$TID/...这个名字,

使用prctl(2)函数和PR_SET_NAME选项(请参阅文档 )。

请注意,文档有点混乱。 他们说

设置调用进程的进程名称

但是由于线程在Linux上是轻量级进程(LWP),所以在这种情况下一个线程就是一个进程。

你可以在()之间看到ps -o cmd/proc/$PID/stat的线程名:

 4223 (kjournald) S 1 1 1 0... 

从glibc v2.12开始,可以使用pthread_setname_nppthread_getname_np设置/获取线程名称。

这些接口在一些其他POSIX系统(BSD,QNX,Mac)上可用,forms稍有不同。

设置名称将是这样的:

 #include <pthread.h> // or maybe <pthread_np.h> for some OSes // Linux int pthread_setname_np(pthread_t thread, const char *name); // NetBSD: name + arg work like printf(name, arg) int pthread_setname_np(pthread_t thread, const char *name, void *arg); // FreeBSD & OpenBSD: function name is slightly different, and has no return value void pthread_set_name_np(pthread_t tid, const char *name); // Mac OS X: must be set from within the thread (can't specify thread ID) int pthread_setname_np(const char*); 

你可以得到这个名字:

 #include <pthread.h> // or <pthread_np.h> ? // Linux, NetBSD: int pthread_getname_np(pthread_t th, char *buf, size_t len); // some implementations don't have a safe buffer (see MKS/IBM below) int pthread_getname_np(pthread_t thread, const char **name); int pthread_getname_np(pthread_t thread, char *name); // FreeBSD & OpenBSD: dont' seem to have getname/get_name equivalent? // but I'd imagine there's some other mechanism to read it directly for say gdb // Mac OS X: int pthread_getname_np(pthread_t, char*, size_t); 

正如你所看到的,它在POSIX系统之间不是完全可移植的,但据我所知,它应该是一致的。 除Mac OS X之外(其中只能从线程内执行),其他人至less可以简单地适应跨平台代码。

资料来源:

  • glibc NEWS (在2.12中提到新的接口)
  • glibc nptl / ChangeLog (在2.12中提到新的接口)
  • MKS设置名/ getname
  • IBM的setname / getname
  • 来自/Developer/SDKs/MacOSX10.7.sdk/usr/include/pthread.h Mac OS X
  • QNX setname / getname
  • FreeBSD的setname /没有getname据我所见
  • 就我所知,OpenBSD的setname / no getname
  • NetBSD的setname / getname

你可以通过创build一个将pthread_t映射到std::string的字典来实现,然后将pthread_self()的结果与你想分配给当前线程的名字联系起来。 请注意,如果你这样做,你将需要使用互斥或​​其他同步原语来防止多个线程同时修改字典(除非你的字典实现已经为你做了这个)。 您也可以使用线程特定的variables(请参阅pthread_key_create , pthread_setspecific , pthread_getspecific和pthread_key_delete )以保存当前线程的名称; 但是,如果你这样做,你将无法访问其他线程的名字(而用字典,你可以从任何线程遍历所有的线程ID /名称对)。