GNU/Linux >> Tutoriels Linux >  >> Linux

Comment obtenir l'identifiant de thread d'un pthread dans le programme linux c?

Quoi? La personne a demandé spécifique à 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 <unistd.h>
#include <sys/syscall.h>

 ....

 pid_t x = syscall(__NR_gettid);

Bien que cela ne soit pas 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 LOG) comme un entier normal.


Comme indiqué dans d'autres réponses, pthreads ne définit pas de méthode indépendante de la plate-forme pour récupérer 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 la raison pour laquelle vous pensez avoir besoin d'un ID de thread est de savoir si vous exécutez sur le même thread ou sur un autre thread que vous contrôlez, vous pourriez trouver une utilité 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 fil principal (premier) du processus ?.


pid_t tid = syscall(SYS_gettid);

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


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

pthread_t pthread_self(void);

Le pthread_self() La fonction renvoie le handle 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);

Linux
  1. Comment terminer un thread dans un programme C ( exemple pthread_exit )

  2. Comment créer des threads sous Linux (avec un exemple de programme C)

  3. Comment obtenir la taille du répertoire sous Linux

  4. AVR - Comment programmer une puce AVR sous Linux

  5. Comment obtenir un masque de réseau à partir de bash ?

Comment obtenir des informations sur d'autres utilisateurs de Linux

Comment obtenir votre adresse IP sous Linux

Comment démarrer avec Arch Linux

Brilliant Ways sur la façon d'exécuter un programme sous Linux

Comment obtenir une liste de liens symboliques sous Linux

Comment écrire et exécuter un programme C sous Linux