À partir de la glibc v2.12, vous pouvez utiliser pthread_setname_np
y pthread_getname_np
pour définir/obtenir le nom du fil.
Ces interfaces sont disponibles sur quelques autres systèmes POSIX (BSD, QNX, Mac) sous diverses formes légèrement différentes.
La définition du nom sera quelque chose comme ceci :
#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*);
Et vous pouvez récupérer le nom :
#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);
Comme vous pouvez le voir, il n'est pas complètement portable entre les systèmes POSIX, mais pour autant que je puisse dire à travers linux il doit être cohérent. À l'exception de Mac OS X (où vous ne pouvez le faire qu'à partir du fil de discussion), les autres sont au moins simples à adapter pour le code multiplateforme.
Fuentes:
1 votes
Pourriez-vous éventuellement expliquer à l'aide d'exemples comment les noms peuvent être utiles au débogage ?
9 votes
@skwllsp : Pour que vous puissiez identifier plus facilement le fil de discussion ?
2 votes
Les noms de threads sont très utiles lorsque vous avez des programmes avec un grand nombre de threads différents, chacun faisant quelque chose de spécifique (comme une configuration de pipeline où chaque thread effectue une partie d'une tâche de traitement pour chaque paquet). J'en ai vu la nécessité. De bons outils de débogage avec conscience du système d'exploitation devraient également être capables d'afficher ces noms, mais je ne sais pas exactement combien de débogueurs le font aujourd'hui.
1 votes
Duplicata de stackoverflow.com/questions/778085/
0 votes
Peut-être une meilleure solution car les fonctions par défaut ne reflètent pas le nom dans le fichier
/proc/self/comm
fichier du fil. Ou bien il duplique l'ensemble des noms de famille, ce qui est aussi inutile que de ne pas en avoir. L'écriture directe dans le fichier comm est autorisée et fonctionne comme prévu pour un certain nombre d'outils (tels quehtop
yps
).