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


94

Nel programma linux c, come stampare l'ID del thread di un thread creato dalla libreria pthread?
ad esempio: possiamo ottenere il pid di un processo dagetpid()

Risposte:


81

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

La pthread_self()funzione restituisce l'handle Pthread del thread chiamante. La funzione pthread_self () NON restituisce il thread integrale del thread chiamante. È necessario utilizzare pthread_getthreadid_np()per restituire un identificatore integrale per il thread.

NOTA:

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


38
La domanda originale riguardava Linux. Linux non include le funzioni _np. (Non include le loro pagine man, non ho controllato oltre.)
Trade-Ideas Philip

pthread_threadid_np è disponibile su OS X> = 10.6 e iOS> = 3.2.
bleater

@Bleater Puoi fornire la documentazione ufficiale per pthread_threadid_np. Ho bisogno di utilizzare per un progetto, quindi è necessario verificare l'affidabilità di tale API nelle piattaforme iOS e OSX. Ha fatto riferimento al collegamento su opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.h ma non sono sicuro che sia quello giusto.
Vivek Maran

@Vivek Non ho alcun collegamento ai documenti ufficiali, solo l'intestazione che colleghi e la fonte su opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.c
bleater

10
@ Trade-IdeasPhilip - Per chiarire, _npsignifica non portatile. Linux ha le sue _npcose, ma non include quelle di Apple pthread_getthreadid_np.
Josh Kelley

85

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:

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 intero.


11
Questa dovrebbe essere la risposta vera
Matthew S

La persona ha chiesto informazioni su qualcosa che funzionasse su Linux. Farlo in modo portatile mi sembra il modo preferibile per farlo. Se la portabilità non conta nulla, immagino che Linux stia davvero diventando il nuovo Windows ...
Jasper Siepkes

3
@ Jasper Siepkes Ti manca il punto. Ha chiesto una chiamata LINUX che fosse l'equivalente di getpid () per i thread. Questo è gettid (). La domanda non chiedeva sulla portabilità o POSIX. Troppe persone vogliono mettersi in mostra e provare a insegnare piuttosto che fare la domanda come chiesto. pthread_self () non restituisce l'id del thread del kernel e non è manipolabile in un modo che semplifichi la stampa. Inoltre, pthread_self è probabilmente un puntatore e non dovrebbe essere manipolato, ma solo confrontato con pthread_equal (). La domanda richiedeva un ID che puoi stampare, e questo è gettid ().
Evan Langlois

3
@EvanLanglois Sta lavorando con la libreria pthread, letteralmente la libreria di thread POSIX. Fare una risposta compatibile POSIX non è così strano. "Ha chiesto una chiamata LINUX che fosse l'equivalente di getpid () per i thread." No, è getpid()stato dato come esempio. Non diceva che la semantica fosse una specifica rigida. Rendere le persone consapevoli di fare le cose in un modo compatibile con POSIX in modo che altre comunità oltre a Linux (come FreeBSD, Illumos, OS X, ecc.) Possano trarne vantaggio non è "mettersi in mostra". Come ho detto, immagino che Linux sia davvero diventato il prossimo Windows.
Jasper Siepkes

14

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

Su sistemi Linux, puoi ottenere l'ID del thread in questo modo:

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 lo stesso thread o un thread diverso su un altro thread che controlli, potresti trovare qualche utilità in questo approccio

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 thread principale (primo) nel processo? .


13

Linux fornisce tale chiamata di sistema per consentire di ottenere l'ID di un thread.


Secondo questa risposta , hai bisogno #include <unistd.h>e #include <sys/syscall.h>per questo.
ComFreek

9

Puoi usare pthread_self()

Il genitore conosce l'id del thread dopo che pthread_create()è stato eseguito con successo, ma durante l'esecuzione del thread se vogliamo accedere all'id del thread dobbiamo usare la funzione pthread_self().


7

Questa singola riga ti dà pid, ogni threadid e spid.


3

pthread_getthreadid_npnon era sul mio Mac os x. pthread_tè un tipo opaco. Non sbatterci la testa sopra. Assegnalo void*e chiamalo buono. Se hai bisogno di printfusare %p.


1
Sì, funziona. Tutto ciò di cui ho bisogno è stamparlo per il debug, quindi 0x23423423423abcdef è utile quanto tid = 1234. Grazie!
Qi Fan

3

Penso che non solo la domanda non sia chiara, ma anche la maggior parte delle persone non è consapevole della differenza. Esamina il seguente detto,

Gli ID thread POSIX non sono gli stessi degli ID thread restituiti dalla gettid()chiamata di sistema specifica di Linux . Gli ID thread POSIX vengono assegnati e gestiti dall'implementazione del threading. L'ID thread restituito da gettid()è un numero (simile a un ID processo) assegnato dal kernel. Sebbene ogni thread POSIX abbia un ID thread del kernel univoco nell'implementazione del threading NPTL di Linux, un'applicazione generalmente non ha bisogno di conoscere gli ID del kernel (e non sarà portabile se dipende dalla loro conoscenza).

Tratto da: The Linux Programming Interface: A Linux and UNIX System Programming Handbook, Michael Kerrisk

IMHO, c'è solo un modo portabile che passa una struttura in cui definire una variabile contenente numeri in modo crescente, ad esempio 1,2,3... per thread. In questo modo, l'id dei thread può essere tenuto traccia. Tuttavia, la int pthread_equal(tid1, tid2)funzione dovrebbe essere utilizzata.


In gettid()realtà è un buon suggerimento, grazie! Tuttavia, dovevo seguire la risposta di Sergey L. qui: stackoverflow.com/a/21280941/2430526
SRG

1

C'è anche un altro modo per ottenere l'ID del thread. Durante la creazione di thread con

int pthread_create(pthread_t * thread, const pthread_attr_t * attr, void * (*start_routine)(void *), void *arg);

chiamata di funzione; il primo parametro pthread_t * threadè in realtà un ID thread (che è un int lungo senza segno definito in bits / pthreadtypes.h). Inoltre, l'ultimo argomento void *argè l'argomento a cui viene passato void * (*start_routine) funzione da sottoporre a thread.

È possibile creare una struttura per passare più argomenti e inviare un puntatore a una struttura.


-1

Puoi anche scrivere in questo modo e fa lo stesso. Ad esempio:

Questo programma imposta un array di pthread_t e calcola la somma su ciascuno. Quindi stampa la somma di ogni thread con ID thread.


Non risponde alla domanda e anche la descrizione del codice è sbagliata!
U. Windl

-2

Il modo indipendente dalla piattaforma (a partire da c ++ 11) è:


questo probabilmente non è "indipendente dalla piattaforma" come pensi. sulla mia implementazione si risolve in a pthread_t. Su un Mac che sarà un puntatore e su Linux un numero intero. Inoltre non riflette l'id "nativo" che potresti vedere topad esempio. Qualcosa di cui essere a conoscenza, ma forse va bene per alcuni usi.
Brad Allred

1
In C11 (la domanda riguardava C) useresti thrd_current () da threads.h
jerry
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.