繁体   English   中英

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

[英]How to set the name of a thread in Linux pthreads?

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

我的主要目的是它在调试时会很有帮助,如果该名称通过例如/proc/$PID/task/$TID/...

从 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(你只能在线程内完成),其他的至少很容易适应跨平台代码。

资料来源:

使用带有选项PR_SET_NAMEprctl(2)函数(请参阅文档)。

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

为调用进程设置进程名称

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

您可以使用ps -o cmd或使用以下ps -o cmd查看线程名称:

cat /proc/$PID/task/$TID/comm

或在cat /proc/$PID/task/$TID/stat()之间:

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

或来自双引号之间的 GDB info threads

* 1    Thread 0x7ffff7fc7700 (LWP 6575) "kjournald" 0x00007ffff78bc30d in nanosleep () at ../sysdeps/unix/syscall-template.S:84                                                                                  

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM