GNU/Linux >> Linux Esercitazione >  >> Linux

Come impostare il nome di un thread nei pthread di Linux?

Puoi implementarlo tu stesso creando un dizionario che mappa pthread_t a std::string , quindi associare il risultato di pthread_self() al nome che si desidera assegnare al thread corrente. Nota che, se lo fai, dovrai usare un mutex o un'altra primitiva di sincronizzazione per impedire a più thread di modificare contemporaneamente il dizionario (a meno che l'implementazione del tuo dizionario non lo faccia già per te). Puoi anche usare variabili specifiche del thread (vedi pthread_key_create, pthread_setspecific, pthread_getspecific e pthread_key_delete) per salvare il nome del thread corrente; tuttavia, se lo fai non sarai in grado di accedere ai nomi di altri thread (mentre, con un dizionario, puoi iterare su tutte le coppie ID/nome di thread da qualsiasi thread).


A partire da glibc v2.12, puoi usare pthread_setname_np e pthread_getname_np per impostare/ottenere il nome del thread.

Queste interfacce sono disponibili su alcuni altri sistemi POSIX (BSD, QNX, Mac) in varie forme leggermente diverse.

L'impostazione del nome sarà simile a questa:

#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*);

E puoi recuperare il nome:

#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);

Come puoi vedere non è completamente portabile tra i sistemi POSIX, ma per quanto ne so su linux dovrebbe essere coerente. A parte Mac OS X (dove puoi farlo solo dall'interno del thread), gli altri sono almeno semplici da adattare al codice multipiattaforma.

Fonti:

  • NOTIZIE glibc (menziona nuove interfacce nella 2.12)
  • glibc nptl/ChangeLog (menziona nuove interfacce in 2.12)
  • MKS setname / getname
  • IBM setname / getname
  • Mac OS X da /Developer/SDKs/MacOSX10.7.sdk/usr/include/pthread.h
  • QNX setname / getname
  • FreeBSD setname / nessun getname per quanto posso vedere
  • OpenBSD setname / nessun getname per quanto posso vedere
  • NetBSD setname / getname

Usa il prctl(2) funzione con l'opzione PR_SET_NAME (vedi i documenti).

Si noti che le vecchie versioni dei documenti sono un po' confuse. Dicono

Imposta il nome del processo per il processo chiamante

ma poiché i thread sono processi leggeri (LWP) su Linux, in questo caso un thread è un processo.

Puoi vedere il nome del thread con ps -o cmd o con:

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

o tra () di cat /proc/$PID/task/$TID/stat :

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

o da GDB info threads tra virgolette:

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

Linux
  1. Come si imposta a livello di codice l'orologio hardware su Linux?

  2. Come nominare un thread in Linux?

  3. Come impostare a livello di codice una variabile di ambiente permanente in Linux?

  4. Come impostare l'indirizzo IP da C in Linux

  5. Come impostare il titolo di una finestra in Linux

Come impostare o modificare il fuso orario in Linux

Come impostare o modificare il nome host su Linux

Come impostare il nome host Pretty

Come configurare il cluster RabbitMQ su Ubuntu/Debian Linux

Come configurare il firewall UFW su Linux

Come modificare il nome host su Debian Linux