Obtener el ID del hilo en C

Jinku Hu 12 octubre 2023
  1. Utilice la función pthread_self para obtener el ID de subproceso en C
  2. Utilice la función gettid para obtener el ID del hilo en C
  3. Utilice la función thrd_current para obtener el ID de subproceso en C
Obtener el ID del hilo en C

Este artículo demostrará varios métodos sobre cómo obtener el ID de subproceso en C.

Utilice la función pthread_self para obtener el ID de subproceso en C

Los subprocesos son la piedra angular del rendimiento en las CPU contemporáneas, ya que estas últimas tienden a agregar más núcleos virtuales o físicos hoy en día para admitir mejores flujos de trabajo de subprocesos múltiples. Generalmente, un hilo se denota como un único flujo de control en un proceso (es decir, un programa en ejecución). Por lo tanto, los subprocesos se utilizan para implementar múltiples flujos lógicos que se ejecutarían simultáneamente y formarían un programa que utiliza múltiples núcleos de CPU. Tenga en cuenta que los subprocesos POSIX han sido la interfaz estándar más antigua para acceder a las funciones de subprocesamiento en programas C. pthread_self es una de las funciones proporcionadas por la API de pthreads que puede recuperar el ID del hilo de llamada. Toma cero argumentos y devuelve el número entero que denota el ID del hilo como la variable de tipo pthread_t.

En el siguiente código de ejemplo, implementamos el escenario básico de múltiples subprocesos, donde el programa principal (subproceso) crea cuatro subprocesos adicionales que ejecutan la función printHello y terminan usando la llamada a la función pthread_exit. Observe que se están ejecutando cinco subprocesos durante este programa, y ​​todos salen después de que se ejecuta la ruta de código dada. En la función printHello, todos imprimen su ID de hilo usando la función 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);
}

Producción :

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

Utilice la función gettid para obtener el ID del hilo en C

gettid es una llamada al sistema específica de Linux que se proporciona mediante el contenedor de funciones en el programa C, y devuelve el ID del hilo de quien llama. La función no toma argumentos similares a pthread_self y devuelve el valor entero de tipo pid_t. Tenga en cuenta que el valor devuelto por la llamada gettid no es el mismo que el ID recuperado de la función pthread_self, que se llama ID de hilo POSIX. Si el programa es de un solo subproceso, gettid devuelve el mismo valor que getpid igual al ID del proceso.

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

Producción :

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

Utilice la función thrd_current para obtener el ID de subproceso en C

thrd_current es parte de la API de subprocesos ISO C agregada a la especificación de lenguaje estándar en 2011. Tenga en cuenta que esta API proporciona una interfaz estándar para sistemas operativos compatibles con POSIX y cualquier plataforma que proporcione un compilador C compatible con el estándar. Por lo tanto, este método es la forma recomendada de interactuar con subprocesos en el lenguaje C. Usamos las funciones pthread para crear y salir de los hilos en el siguiente ejemplo, sin embargo, se debe elegir una única interfaz (Pthreads o ISO C) cuando se trabaja en un proyecto.

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

Producción :

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

Artículo relacionado - C Thread