如何在Linux pthreads中设置线程的名称?

时间:2010-03-03 08:36:33

标签: c linux pthreads

有没有办法在Linux中设置线程的名称?

我的主要目的是在调试时提供帮助,如果通过例如/proc/$PID/task/$TID/...

3 个答案:

答案 0 :(得分:98)

从glibc v2.12开始,您可以使用pthread_setname_nppthread_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(你只能在线程内完成),其他的至少要适应跨平台代码。

来源:

答案 1 :(得分:29)

prctl(2)功能与PR_SET_NAME选项一起使用(请参阅the docs)。

请注意,文档有点令人困惑。他们说

  

设置调用进程的进程名称

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

您可以使用ps -o cmd或使用

查看主题名称
cat /proc/$PID/task/$TID/comm

或在()的{​​{1}}之间:

cat /proc/$PID/task/$TID/stat

或来自双引号之间的GDB 4223 (kjournald) S 1 1 1 0...

info threads

答案 2 :(得分:5)

您可以通过创建字典映射pthread_tstd::string来自行实现,然后将pthread_self()的结果与您要分配给当前线程的名称相关联。请注意,如果这样做,您将需要使用互斥或​​其他同步原语来防止多个线程同时修改字典(除非您的字典实现已经为您执行此操作)。您还可以使用特定于线程的变量(请参阅pthread_key_createpthread_setspecificpthread_getspecificpthread_key_delete)以保存当前线程的名称;但是,如果你这样做,你将无法访问其他线程的名称(而使用字典,你可以迭代任何线程中的所有线程ID /名称对)。