thread suma que pthread_self procesos pid_t hilos funcion ejercicios con c linux pthreads

c - suma - pthread_self



cómo obtener el id. de subproceso de un pthread en el programa linux c? (8)

En el programa linux c, ¿cómo imprimir el id. De subproceso de un subproceso creado por la biblioteca pthread?
por ejemplo: podemos obtener pid de un proceso por getpid()


¿Qué? La persona pidió Linux específico, y el equivalente de getpid (). No BSD o Apple. La respuesta es gettid () y devuelve un tipo integral. Tendrás que llamarlo usando syscall (), así:

#include <sys/types.h> #include <sys/syscall.h> .... pid_t x = syscall(__NR_gettid);

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


Como se señala en otras respuestas, pthreads no define una forma independiente de plataforma para recuperar una identificación de subproceso integral.

En sistemas Linux, puede obtener ID de hilo de esta manera:

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

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

Sin embargo, si cree que necesita una ID de hilo para saber si está ejecutando el mismo hilo o un hilo diferente de otro hilo que controle, 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 (primero) en el proceso? .


Esta única línea te da pid, cada hilo y spid.

printf("before calling pthread_create getpid: %d getpthread_self: %lu tid:%lu/n",getpid(), pthread_self(), syscall(SYS_gettid));


Puedes usar pthread_self()

El padre conoce el id. Del subproceso después de que pthread_create() se ejecuta con éxito, pero mientras ejecuta el subproceso si queremos acceder al id. Del subproceso, tenemos que usar la función pthread_self() .


También hay otra forma de obtener ID de hilo. Al crear hilos con

int pthread_create(pthread_t * thread, const pthread_attr_t * attr, void * (*start_routine)(void *), void *arg);

Llamada de función; el primer parámetro pthread_t * thread es en realidad un id. de subproceso (que es unsigned long int definido en bits / pthreadtypes.h). Además, el último argumento void *arg es el argumento que se pasa a la función void * (*start_routine) .

Puede crear una estructura para pasar múltiples argumentos y enviar un puntero a una estructura.

typedef struct thread_info { pthread_t thread; //... } thread_info; //... tinfo = malloc(sizeof(thread_info) * NUMBER_OF_THREADS); //... pthread_create (&tinfo[i].thread, NULL, handler, (void*)&tinfo[i]); //... void *handler(void *targs) { thread_info *tinfo = targs; // here you get the thread id with tinfo->thread }


pthread_getthreadid_np no estaba en mi Mac os x. pthread_t es un tipo opaco. No te golpees la cabeza con eso. Simplemente asignes a void* y llámalo bueno. Si necesita printf use %p .


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

pthread_t pthread_self(void);

La función pthread_self() devuelve el manejador Pthread del hilo de llamada. La función pthread_self () NO devuelve el hilo integral del hilo de llamada. Debe 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 proporciona el mismo comportamiento.

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


pid_t tid = syscall(SYS_gettid);

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