Obtenir l'ID de thread en C

Jinku Hu 12 octobre 2023
  1. Utilisez la fonction pthread_self pour obtenir l’ID de thread en C
  2. Utilisez la fonction gettid pour obtenir l’ID de thread en C
  3. Utilisez la fonction thrd_current pour obtenir l’ID de thread en C
Obtenir l'ID de thread en C

Cet article présente plusieurs méthodes sur la façon d’obtenir l’ID de thread en C.

Utilisez la fonction pthread_self pour obtenir l’ID de thread en C

Les threads sont la pierre angulaire des performances sur les processeurs contemporains, car ces derniers ont tendance à ajouter plus de cœurs virtuels ou physiques de nos jours pour prendre en charge de meilleurs flux de travail multi-thread. Généralement, un thread est désigné comme un flux de contrôle unique dans un processus (c’est-à-dire, un programme en cours d’exécution). Ainsi, les threads sont utilisés pour implémenter plusieurs flux logiques qui s’exécuteraient simultanément et formeraient un programme utilisant plusieurs cœurs de processeur. Notez que les threads POSIX ont été la plus ancienne interface standard pour accéder aux fonctionnalités de threading dans les programmes C. pthread_self est l’une des fonctions fournies par l’API pthreads qui peut récupérer l’ID du thread appelant. Il ne prend aucun argument et renvoie l’entier indiquant l’ID de thread comme variable de type pthread_t.

Dans l’exemple de code suivant, nous avons implémenté le scénario multi-thread de base, où le programme principal (thread) crée quatre threads supplémentaires qui exécutent la fonction printHello et se terminent à l’aide de l’appel de fonction pthread_exit. Notez que cinq threads sont en cours d’exécution pendant ce programme et tous se terminent après l’exécution du chemin de code donné. Dans la fonction printHello, tous impriment leur ID de thread en utilisant la fonction pthread_self.

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef NUM_THREADS
#define NUM_THREADS 4
#endif

void *printHello(void *threadid) {
  long tid;
  tid = (long)threadid;
  printf("Hello There! thread %ld, pthread ID - %lu\n", tid, pthread_self());
  pthread_exit(NULL);
}

int main(int argc, char const *argv[]) {
  pthread_t threads[NUM_THREADS];
  int rc;
  long t;

  for (t = 0; t < NUM_THREADS; t++) {
    rc = pthread_create(&threads[t], NULL, printHello, (void *)t);
    if (rc) {
      printf("ERORR; return code from pthread_create() is %d\n", rc);
      exit(EXIT_FAILURE);
    }
  }
  pthread_exit(NULL);
}

Production:

Hello There! thread 1, pthread ID - 140388002486016
Hello There! thread 0, pthread ID - 140388010878720
Hello There! thread 2, pthread ID - 140387994093312
Hello There! thread 3, pthread ID - 140387985700608

Utilisez la fonction gettid pour obtenir l’ID de thread en C

gettid est un appel système spécifique à Linux fourni à l’aide de l’encapsuleur de fonction dans le programme C, et il renvoie l’ID de thread de l’appelant. La fonction ne prend aucun argument similaire à pthread_self et renvoie la valeur entière de type pid_t. Notez que la valeur renvoyée par l’appel gettid n’est pas la même que l’ID récupéré de la fonction pthread_self, qui est appelée ID de thread POSIX. Si le programme est monothread, gettid renvoie la même valeur que getpid - égale à l’ID de processus.

#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef NUM_THREADS
#define NUM_THREADS 4
#endif

void *printHello(void *threadid) {
  long tid;
  tid = (long)threadid;
  printf("Hello There! thread %ld, kthread ID - %d\n", tid, gettid());
  pthread_exit(NULL);
}

int main(int argc, char const *argv[]) {
  pthread_t threads[NUM_THREADS];
  int rc;
  long t;

  for (t = 0; t < NUM_THREADS; t++) {
    rc = pthread_create(&threads[t], NULL, printHello, (void *)t);
    if (rc) {
      printf("ERORR; return code from pthread_create() is %d\n", rc);
      exit(EXIT_FAILURE);
    }
  }
  pthread_exit(NULL);
}

Production:

Hello There! thread 0, kthread ID - 10389
Hello There! thread 1, kthread ID - 10390
Hello There! thread 2, kthread ID - 10391
Hello There! thread 3, kthread ID - 10392

Utilisez la fonction thrd_current pour obtenir l’ID de thread en C

thrd_current fait partie de l’API des threads ISO C ajoutée à la spécification du langage standard en 2011. Notez que cette API fournit une interface standard pour les systèmes d’exploitation compatibles POSIX et toute plate-forme qui fournit un compilateur C conforme à la norme. Ainsi, cette méthode est recommandée pour interagir avec les threads en langage C. Nous utilisons les fonctions pthread pour créer et quitter les threads dans l’exemple suivant, cependant, il faut choisir une seule interface (Pthreads ou ISO C) lorsque l’on travaille sur un projet.

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <threads.h>
#include <unistd.h>

#ifndef NUM_THREADS
#define NUM_THREADS 4
#endif

void *printHello(void *threadid) {
  long tid;
  tid = (long)threadid;
  printf("Hello There! thread %ld, pthread ID - %lu\n", tid, thrd_current());
  pthread_exit(NULL);
}

int main(int argc, char const *argv[]) {
  pthread_t threads[NUM_THREADS];
  int rc;
  long t;

  for (t = 0; t < NUM_THREADS; t++) {
    rc = pthread_create(&threads[t], NULL, printHello, (void *)t);
    if (rc) {
      printf("ERORR; return code from pthread_create() is %d\n", rc);
      exit(EXIT_FAILURE);
    }
  }
  pthread_exit(NULL);
}

Production:

Hello There! thread 0, pthread ID - 139727514998528
Hello There! thread 1, pthread ID - 139727506605824
Hello There! thread 2, pthread ID - 139727498213120
Hello There! thread 3, pthread ID - 139727489820416
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C Thread