从 glibc v2.12 开始,您可以使用pthread_setname_np
and pthread_getname_np
设置/获取线程名称。
这些接口以各种略有不同的形式在其他一些 POSIX 系统(BSD、QNX、Mac)上可用。
设置名称将是这样的:
#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 系统之间并不完全可移植,但据我所知linux它应该是一致的。除了 Mac OS X(您只能在线程内执行此操作)之外,其他操作系统至少很容易适应跨平台代码。
Sources:
- glibc NEWS(提到2.12中的新接口)
- glibc nptl/更改日志(提到2.12中的新接口)
- MKS setname / getname
- IBM setname / getname
- Mac OS X 从
/Developer/SDKs/MacOSX10.7.sdk/usr/include/pthread.h
- QNX setname / getname
- FreeBSD setname/ 据我所知没有 getname
- OpenBSD setname/ 据我所知没有 getname
- NetBSD setname / getname