2011-09-01 21 views
11

en RH Linux, cada pthread se correlaciona con un pid, que se puede supervisar en herramientas como htop. pero ¿cómo puedo obtener el pid de un hilo? getpid() simplemente devuelve el pid del hilo principal.Cómo obtener pid de pthread

+0

[Linux 2.6 LinuxThreads reemplazados con NPTL] (http://drdobbs.com/open-source/184406204), Linux ahora sigue POSIX y correctamente devuelve el mismo PID para cada hilo. –

+2

Debería considerar "aceptar" las respuestas que encuentre útiles. –

+0

Steve-o: Tal vez, pero Linux crea un proceso separado para cada hilo (cada hilo obtiene su propio/proc/, donde es diferente del hilo/proceso principal) – Rahly

Respuesta

10

pthread_self();

puede ser llamado para devolver el identificador del subproceso de llamada.

También PID es Id de proceso, Un hilo tiene ID de hilo no PID. Todos los hilos que se ejecutan en el mismo proceso tendrán el mismo PID.

+13

Al igual que la votación negativa es porque lo que dices es incorrecto. De hecho, los hilos de Linux pueden estar representados por un pid, ya que son procesos ligeros. De hecho, la siguiente función existe en Linux unistd.h: pid_t gettid (void).Windows, por otro lado, tiene verdaderos identificadores de hilos independientes. – ThreeBit

2

Un PID es una ID de proceso, no una ID de subproceso. Los hilos que se ejecutan en el mismo proceso, obviamente, todos estarán asociados con el mismo PID.

Como pthreads intenta ser portable, no puede obtener el ID del subproceso subyacente del SO directamente. Incluso es posible que no haya un hilo del sistema operativo subyacente.

+0

O más bien, dado que los hilos NPTL ya no son registrado como procesos. –

0

hilos tienen TID (threadIds), y todos los hilos corren en el mismo proceso (PID). Por lo tanto, todos los subprocesos deben tener el mismo pid suponiendo que se crean en el mismo proceso, pero tendrán diferentes tids.

pthread_self() da tid, y getpid() obtiene el pid.

22

Hay dos valores de subproceso que se confunden. pthread_self() devolverá la identificación del hilo POSIX; gettid() devolverá la identificación del hilo del sistema operativo. El último es específico de Linux y no se garantiza que sea portátil, pero probablemente sea lo que realmente está buscando.

EDITAR Como notas PlasmaHH, gettid() se llama a través de syscall(). Desde la página syscall() hombre:

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

    int 
    main(int argc, char *argv[]) 
    { 
     pid_t tid; 

     tid = syscall(SYS_gettid); 
    } 
+0

Tenga en cuenta que gettid() no tiene envoltorio glibc y necesita ser llamado a través de syscall() – PlasmaHH

+0

@ PlasmaHH - De acuerdo, debería agregar eso. Fortuitamente, la página del hombre syscall lo usa como un ejemplo. – Duck

+0

gettid() es un poco [controvertido] (http://airlied.livejournal.com/74826.html) –

1

pthread_self hace no obtener el TID. Produce un identificador o puntero de tipo pthread_t para su uso en funciones pthread.

ver aquí por ejemplo lo que podría devolver un programa de mundo real:

http://www.c-plusplus.de/forum/212807-full

1

En realidad pthread_self retorno pthread_t y no una ID del tema entero se puede trabajar con la siguiente función de ayuda le conseguirá que, en una forma portátil en diferentes sistemas POSIX.

uint64_t gettid() { 
    pthread_t ptid = pthread_self(); 
    uint64_t threadId = 0; 
    memcpy(&threadId, &ptid, std::min(sizeof(threadId), sizeof(ptid))); 
    return threadId; 
}