Obtener el ID del hilo en C
-
Utilice la función
pthread_self
para obtener el ID de subproceso en C -
Utilice la función
gettid
para obtener el ID del hilo en C -
Utilice la función
thrd_current
para obtener el ID de subproceso 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
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