我可以在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_np
和pthread_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 /名称对)。