En el programa linux c, ¿cómo imprimir la identificación del hilo de un hilo creado por la biblioteca pthread?
por ejemplo: podemos obtener el pid de un proceso porgetpid()
89
pthread_self()
La función dará la identificación del hilo del hilo actual.
pthread_t pthread_self(void);
La pthread_self()
función devuelve el identificador 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 ofrece el mismo comportamiento.
pthread_id_np_t tid;
pthread_t self;
self = pthread_self();
pthread_getunique_np(&self, &tid);
pthread_threadid_np
. Necesito usarlo para un proyecto, así que necesito verificar la confiabilidad de esa API en las plataformas iOS y OSX. Referí el enlace en opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.h pero no estoy seguro de si es el correcto._np
significa no portátil. Linux tiene sus propias_np
cosas, pero no incluye las de Applepthread_getthreadid_np
.¿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.
fuente
getpid()
se dio como ejemplo. No dijo que la semántica fuera una especificación estricta. Hacer que la gente sea consciente de hacer las cosas de una manera compatible con POSIX para que otras comunidades además de Linux (como FreeBSD, Illumos, OS X, etc.) puedan beneficiarse de ellas no es "presumir". Como dije, supongo que Linux realmente se ha convertido en el próximo Windows.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 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? .
fuente
pid_t tid = syscall(SYS_gettid);
Linux proporciona dicha llamada al sistema para permitirle obtener la identificación de un hilo.
fuente
Puedes usar
pthread_self()
El padre llega a conocer la identificación del hilo después de que
pthread_create()
se ejecuta con éxito, pero mientras ejecutamos el hilo, si queremos acceder a la identificación del hilo, tenemos que usar la funciónpthread_self()
.fuente
Esta única línea le da pid, cada threadid y spid.
printf("before calling pthread_create getpid: %d getpthread_self: %lu tid:%lu\n",getpid(), pthread_self(), syscall(SYS_gettid));
fuente
pthread_getthreadid_np
no estaba en mi Mac os x.pthread_t
es un tipo opaco. No se golpee la cabeza por eso. Simplemente asígnelovoid*
y llámelo bueno. Si necesitaprintf
usar%p
.fuente
Creo que la pregunta no solo no está clara, sino que la mayoría de las personas tampoco son conscientes de la diferencia. Examine el siguiente dicho,
En mi humilde opinión, solo hay una forma portátil de pasar una estructura en la que se define una variable que contiene números de manera ascendente, por ejemplo,
1,2,3...
por hilo. Al hacer esto, se puede realizar un seguimiento de la identificación de los hilos. No obstante, seint pthread_equal(tid1, tid2)
debe utilizar la función.if (pthread_equal(tid1, tid2)) printf("Thread 2 is same as thread 1.\n"); else printf("Thread 2 is NOT same as thread 1.\n");
fuente
gettid()
realidad, es una buena sugerencia, ¡gracias! Sin embargo, necesitaba seguir la respuesta de Sergey L. aquí: stackoverflow.com/a/21280941/2430526También hay otra forma de obtener la identificación del 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 hilo (es decir, un int largo sin signo definido en bits / pthreadtypes.h). Además, el último argumentovoid *arg
es el argumento que se pasa a lavoid * (*start_routine)
función para ser subproceso.Puede crear una estructura para pasar varios 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 }
fuente
También puede escribir de esta manera y hace lo mismo. Por ejemplo:
for(int i=0;i < total; i++) { pthread_join(pth[i],NULL); cout << "SUM of thread id " << pth[i] << " is " << args[i].sum << endl; }
Este programa configura una matriz de pthread_t y calcula la suma de cada uno. Entonces está imprimiendo la suma de cada hilo con el ID del hilo.
fuente
La forma independiente de la plataforma (a partir de c ++ 11) es:
#include <thread> std::this_thread::get_id();
fuente
pthread_t
. En una Mac, será un puntero y en Linux un número entero. Tampoco refleja la identificación "nativa" que puede ver,top
por ejemplo. Algo a tener en cuenta, pero tal vez esté bien para algunos usos.