Ottieni l'ID thread in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione pthread_self per ottenere l’ID del thread in C
  2. Usa la funzione gettid per ottenere l’ID del thread in C
  3. Usa la funzione thrd_current per ottenere l’ID del thread in C
Ottieni l'ID thread in C

Questo articolo illustrerà più metodi su come ottenere l’ID thread in C.

Usa la funzione pthread_self per ottenere l’ID del thread in C

I thread sono la pietra angolare delle prestazioni sulle CPU contemporanee poiché queste ultime tendono ad aggiungere più core virtuali o fisici al giorno d’oggi per supportare migliori flussi di lavoro multi-thread. Generalmente, un thread è indicato come un singolo flusso di controllo in un processo (cioè, programma in esecuzione). Pertanto, i thread vengono utilizzati per implementare più flussi logici che potrebbero essere eseguiti contemporaneamente e formare un programma che utilizza più core della CPU. Notare che i thread POSIX sono stati la più vecchia interfaccia standard per l’accesso alle funzioni di threading nei programmi C. pthread_self è una delle funzioni fornite dall’API pthreads che può recuperare l’ID del thread chiamante. Non richiede argomenti e restituisce il numero intero che denota l’ID del thread come variabile di tipo pthread_t.

Nel seguente codice di esempio, abbiamo implementato lo scenario multi-thread di base, in cui il programma principale (thread) crea quattro thread aggiuntivi che eseguono la funzione printHello e terminano utilizzando la chiamata alla funzione pthread_exit. Notare che cinque thread sono in esecuzione durante questo programma e tutti terminano dopo che il percorso di codice specificato è stato eseguito. Nella funzione printHello, tutti stampano il loro ID thread usando la funzione 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);
}

Produzione:

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

Usa la funzione gettid per ottenere l’ID del thread in C

gettid è una chiamata di sistema specifica di Linux fornita utilizzando il wrapper di funzione nel programma C e restituisce l’ID del thread del chiamante. La funzione non accetta argomenti simili a pthread_self e restituisce il valore intero di tipo pid_t. Notare che il valore restituito dalla chiamata gettid non è lo stesso dell’ID recuperato dalla funzione pthread_self, che è chiamata ID thread POSIX. Se il programma è a thread singolo, gettid restituisce lo stesso valore di getpid, uguale all’ID del processo.

#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);
}

Produzione:

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

Usa la funzione thrd_current per ottenere l’ID del thread in C

thrd_current fa parte dell’API dei thread ISO C aggiunta alla specifica del linguaggio standard nel 2011. Notare che questa API fornisce un’interfaccia standard per i sistemi operativi compatibili con POSIX e qualsiasi piattaforma che fornisce un compilatore C conforme allo standard. Pertanto, questo metodo è il modo consigliato per interagire con i thread nel linguaggio C. Usiamo le funzioni pthread per creare ed uscire dai thread nell’esempio seguente, tuttavia, si dovrebbe scegliere una singola interfaccia (Pthreads o ISO C) quando si lavora su un progetto.

#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);
}

Produzione:

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
Autore: 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

Articolo correlato - C Thread