Saltar al contenido

¿Cómo obtener la identificación del hilo de un pthread en el programa linux c?

Solución:

¿Qué? La persona preguntó por Linux específico y el equivalente a getpid (). Ni BSD ni Apple. La respuesta es gettid () y devuelve un tipo integral. Tendrá que llamarlo usando syscall (), así:

#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>

 ....

 pid_t x = syscall(__NR_gettid);

Si bien esto puede no ser portátil para sistemas que no sean Linux, el threadid es directamente comparable y muy rápido de adquirir. Se puede imprimir (por ejemplo, para LOG) como un entero normal.

pthread_self() La función dará la identificación del hilo del hilo actual.

pthread_t pthread_self(void);

los pthread_self() La función devuelve el identificador Pthread del hilo de llamada. La función pthread_self () NO devuelve el hilo integral del hilo de llamada. Debes usar pthread_getthreadid_np() para devolver un identificador integral para el hilo.

NOTA:

pthread_id_np_t   tid;
tid = pthread_getthreadid_np();

es significativamente más rápido que estas llamadas, pero ofrece el mismo comportamiento.

pthread_id_np_t   tid;
pthread_t         self;
self = pthread_self();
pthread_getunique_np(&self, &tid);

Como se señaló en otras respuestas, pthreads no define una forma independiente de la plataforma para recuperar un ID de hilo integral.

En los sistemas Linux, puede obtener el ID del hilo de la siguiente manera:

#include <sys/types.h>
pid_t tid = gettid();

En muchas plataformas basadas en BSD, esta respuesta https://stackoverflow.com/a/21206357/316487 ofrece una forma no portátil.

Sin embargo, si la razón por la que cree que necesita una ID de subproceso es para saber si se está ejecutando en el mismo subproceso o en un subproceso diferente a otro subproceso que controla, puede encontrar alguna utilidad en este enfoque

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 solo necesita saber si está en el hilo principal, hay formas adicionales, documentadas en las respuestas a esta pregunta, ¿cómo puedo saber si pthread_self es el hilo principal (primer) en el proceso?

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *