GNU/Linux >> Tutoriales Linux >  >> Linux

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

¿Qué? La persona preguntó por Linux específico y el equivalente de getpid(). Ni BSD ni Apple. La respuesta es gettid() y devuelve un tipo integral. Tendrás 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 (como para LOG) como un número entero normal.


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

En los sistemas Linux, puede obtener la ID del subproceso 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 brinda una forma no portátil.

Sin embargo, si la razón por la que cree que necesita una ID de subproceso es saber si está ejecutando en el mismo subproceso o en uno 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 (primer) hilo principal en el proceso?


pid_t tid = syscall(SYS_gettid);

Linux proporciona dicha llamada al sistema para permitirle obtener la identificación de un hilo.


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

pthread_t pthread_self(void);

El 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 que llama. Debes usar pthread_getthreadid_np() para devolver un identificador integral para el subproceso.

NOTA:

pthread_id_np_t   tid;
tid = pthread_getthreadid_np();

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

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

Linux
  1. Cómo terminar un subproceso en un programa C (ejemplo de pthread_exit)

  2. Cómo crear subprocesos en Linux (con un programa de ejemplo en C)

  3. Cómo obtener el tamaño del directorio en Linux

  4. ¿Cómo nombrar un hilo en Linux?

  5. ¿Cómo obtener máscara de red de bash?

Cómo obtener información sobre otros usuarios de Linux

Cómo obtener su dirección IP en Linux

Cómo comenzar con Arch Linux

Maneras brillantes de cómo ejecutar un programa en Linux

Cómo obtener una lista de enlaces simbólicos en Linux

Cómo escribir y ejecutar un programa C en Linux