Puede implementar esto usted mismo creando una asignación de diccionario pthread_t
a std::string
y luego asocie el resultado de pthread_self() con el nombre que desea asignar al subproceso actual. Tenga en cuenta que, si hace eso, necesitará usar un mutex u otra primitiva de sincronización para evitar que varios subprocesos modifiquen el diccionario al mismo tiempo (a menos que la implementación de su diccionario ya lo haga por usted). También puede usar variables específicas del subproceso (consulte pthread_key_create, pthread_setspecific, pthread_getspecific y pthread_key_delete) para guardar el nombre del subproceso actual; sin embargo, no podrá acceder a los nombres de otros subprocesos si lo hace (mientras que, con un diccionario, puede iterar sobre todos los pares de ID/nombre de subprocesos de cualquier subproceso).
A partir de glibc v2.12, puede usar pthread_setname_np
y pthread_getname_np
para establecer/obtener el nombre del hilo.
Estas interfaces están disponibles en algunos otros sistemas POSIX (BSD, QNX, Mac) en varias formas ligeramente diferentes.
Establecer el nombre será algo como esto:
#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*);
Y puedes recuperar el nombre:
#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);
Como puede ver, no es completamente portátil entre los sistemas POSIX, pero por lo que puedo ver en linux debe ser consistente. Aparte de Mac OS X (donde solo puede hacerlo desde dentro del hilo), los demás son al menos fáciles de adaptar para el código multiplataforma.
Fuentes:
- NOTICIAS de glibc (menciona nuevas interfaces en 2.12)
- glibc nptl/ChangeLog (menciona nuevas interfaces en 2.12)
- Nombre de conjunto de MKS/nombre de obtención
- nombre de conjunto de IBM/nombre de obtención
- Mac OS X desde
/Developer/SDKs/MacOSX10.7.sdk/usr/include/pthread.h
- QNX establecer nombre / obtener nombre
- FreeBSD setname / no getname por lo que puedo ver
- OpenBSD setname / no getname por lo que puedo ver
- Nombre de conjunto de NetBSD/nombre de obtención
Usa el prctl(2)
función con la opción PR_SET_NAME
(ver los documentos).
Tenga en cuenta que las versiones anteriores de los documentos son un poco confusas. Ellos dicen
Establecer el nombre del proceso para el proceso de llamada
pero dado que los subprocesos son procesos ligeros (LWP) en Linux, un subproceso es un proceso en este caso.
Puedes ver el nombre del hilo con ps -o cmd
o con:
cat /proc/$PID/task/$TID/comm
o entre los ()
de cat /proc/$PID/task/$TID/stat
:
4223 (kjournald) S 1 1 1 0...
o desde GDB info threads
entre comillas dobles:
* 1 Thread 0x7ffff7fc7700 (LWP 6575) "kjournald" 0x00007ffff78bc30d in nanosleep () at ../sysdeps/unix/syscall-template.S:84