Начиная с glibc v2.12, вы можете использовать pthread_setname_np
и 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 (где вы можете сделать это только из потока), другие, по крайней мере, просты в адаптации для кроссплатформенного кода.
Источники: