GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottenere l'ID thread di un pthread nel programma linux c?

Che cosa? La persona ha chiesto specifiche per Linux e l'equivalente di getpid(). Non BSD o Apple. La risposta è gettid() e restituisce un tipo integrale. Dovrai chiamarlo usando syscall(), in questo modo:

#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>

 ....

 pid_t x = syscall(__NR_gettid);

Anche se questo potrebbe non essere portabile su sistemi non Linux, il threadid è direttamente confrontabile e molto veloce da acquisire. Può essere stampato (come per i LOG) come un normale numero intero.


Come notato in altre risposte, pthreads non definisce un modo indipendente dalla piattaforma per recuperare un ID thread integrale.

Sui sistemi Linux, puoi ottenere l'ID del thread così:

#include <sys/types.h>
pid_t tid = gettid();

Su molte piattaforme basate su BSD, questa risposta https://stackoverflow.com/a/21206357/316487 offre un modo non portatile.

Tuttavia, se il motivo per cui ritieni di aver bisogno di un ID thread è sapere se stai eseguendo sullo stesso thread o su un altro thread che controlli, potresti trovare qualche utilità in questo approccio

static pthread_t threadA;

// On thread A...
threadA = pthread_self();

// On thread B...
pthread_t threadB = pthread_self();
if (pthread_equal(threadA, threadB)) printf("Thread B is same as thread A.\n");
else printf("Thread B is NOT same as thread A.\n");

Se hai solo bisogno di sapere se sei nel thread principale, ci sono altri modi, documentati nelle risposte a questa domanda, come posso sapere se pthread_self è il (primo) thread principale nel processo?.


pid_t tid = syscall(SYS_gettid);

Linux fornisce tale chiamata di sistema per permetterti di ottenere l'id di un thread.


pthread_self() la funzione fornirà l'id del thread corrente.

pthread_t pthread_self(void);

Il pthread_self() La funzione restituisce l'handle Pthread del thread chiamante. La funzione pthread_self() NON restituisce il thread integrale del thread chiamante. Devi usare pthread_getthreadid_np() per restituire un identificatore integrale per il thread.

NOTA:

pthread_id_np_t   tid;
tid = pthread_getthreadid_np();

è significativamente più veloce di queste chiamate, ma fornisce lo stesso comportamento.

pthread_id_np_t   tid;
pthread_t         self;
self = pthread_self();
pthread_getunique_np(&self, &tid);

Linux
  1. Come terminare un thread nel programma C ( pthread_exit Esempio )

  2. Come creare thread in Linux (con un programma di esempio C)

  3. Come ottenere la dimensione della directory in Linux

  4. AVR - Come programmare un chip AVR in Linux

  5. Come sapere dove è bloccato un programma in Linux?

Come ottenere informazioni su altri utenti Linux

Come ottenere il tuo indirizzo IP su Linux

Come iniziare con Arch Linux

Modi brillanti su come eseguire un programma in Linux

Come ottenere un elenco di collegamenti simbolici su Linux

Come scrivere ed eseguire un programma C in Linux