web-dev-qa-db-fra.com

comment obtenir le thread id d'un pthread dans le programme linux c?

Dans le programme linux c, comment imprimer l'identifiant d'un thread créé par la bibliothèque pthread?
par exemple: nous pouvons obtenir le pid d'un processus par getpid()

65
Ravi Chandra

La fonction pthread_self() donnera l'identifiant du thread actuel. 

pthread_t pthread_self(void);

La fonction pthread_self() renvoie le descripteur Pthread du thread appelant. La fonction pthread_self () NE renvoie PAS le thread intégral du thread appelant. Vous devez utiliser pthread_getthreadid_np() pour renvoyer un identifiant intégral pour le thread.

REMARQUE:

pthread_id_np_t   tid;
tid = pthread_getthreadid_np();

est nettement plus rapide que ces appels, mais offre le même comportement.

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

Quoi? La personne a demandé des informations spécifiques à Linux et l’équivalent de getpid (). Pas BSD ou Apple. La réponse est gettid () et renvoie un type intégral. Vous devrez l'appeler en utilisant syscall (), comme ceci:

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

 ....

 pid_t x = syscall(__NR_gettid);

Bien que cela puisse ne pas être portable sur des systèmes non-Linux, le threadid est directement comparable et très rapide à acquérir. Il peut être imprimé (comme pour les journaux) comme un entier normal.

47
Evan Langlois

Vous pouvez utiliser pthread_self()

Le parent apprend l’identifiant du thread après l’exécution de la pthread_create(), mais lors de l’exécution du thread si nous voulons accéder à l’identifiant du thread, nous devons utiliser la fonction pthread_self().

9
Jeff

Comme indiqué dans d'autres réponses, pthreads ne définit pas de moyen indépendant de la plate-forme pour extraire un ID de thread intégral.

Sur les systèmes Linux, vous pouvez obtenir l'ID de thread ainsi:

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

Sur de nombreuses plates-formes basées sur BSD, cette réponse https://stackoverflow.com/a/21206357/316487 donne un moyen non portable.

Cependant, si vous croyez avoir besoin d'un ID de thread pour savoir si vous utilisez le même thread ou un thread différent de celui que vous contrôlez, vous pouvez trouver un utilitaire dans cette approche.

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

Si vous avez juste besoin de savoir si vous êtes sur le fil principal, il existe d'autres moyens documentés dans les réponses à cette question comment puis-je savoir si pthread_self est le (premier) fil principal du processus? .

8
bleater
pid_t tid = syscall(SYS_gettid);

Linux fournit un tel appel système pour vous permettre d’obtenir l’id d’un thread.

7
Weiqi Gu

pthread_getthreadid_np n'était pas sur mon Mac os x. pthread_t est un type opaque. Ne te tape pas la tête dessus. Assignez-le simplement à void* et appelez-le bien. Si vous avez besoin de printf, utilisez %p

3
user2074102

Cette seule ligne vous donne pid, chaque threadid et spid.

 printf("before calling pthread_create getpid: %d getpthread_self: %lu tid:%lu\n",getpid(), pthread_self(), syscall(SYS_gettid));
3
nandan

La manière indépendante de la plate-forme (à partir de c ++ 11) est:

#include <thread>

std::this_thread::get_id();
1
Oleg Oleg

Je pense que non seulement la question n'est pas claire, mais que la plupart des gens ne sont pas conscients de la différence. Examinez le dicton suivant:

Les ID de thread POSIX ne sont pas identiques aux ID de thread renvoyés par le fichier Appel système gettid() spécifique à Linux. Les ID de threads POSIX sont attribués et maintenu par l'implémentation de threading. L'ID du thread est retourné par gettid() est un numéro (similaire à un ID de processus) attribué par le noyau. Bien que chaque thread POSIX ait un identifiant de thread de noyau unique dans l'implémentation du threading NPTL Linux, une application en général n’a pas besoin de connaître les identifiants du noyau (et ne sera pas portable si ça dépend de les connaître).

Extrait de: Interface de programmation Linux: Manuel de programmation système Linux et UNIX, Michael Kerrisk

À mon humble avis, il n’existe qu’une seule méthode portable permettant à une structure de définir des nombres de maintien variables de manière ascendante, par ex. 1,2,3... à par thread. Ce faisant, l'identifiant des threads peut être gardé en trace Néanmoins, int pthread_equal(tid1, tid2) function doit être utilisé.

if (pthread_equal(tid1, tid2)) printf("Thread 2 is same as thread 1.\n");
else printf("Thread 2 is NOT same as thread 1.\n");
0
snr