pthreads: Thread id, pid und pthread_t



  • Hallo,

    Bei Pthreads scheinen Thread id's und pid's verschieden zu sein obwohl
    man mit etwa htop/top pro Thread einen Eintrag mit PID sehen kann?!
    Wenn ich eine pthread_t Variable als Zahl ausgeben will erhalte ich
    fasst immer eine sehr grosse negative Zahl, selbst wenn ich versuche
    diese als "unsigned long" auszugeben.

    1. Warum ist eine pthread_t Variable fasst immer ein sehr grosser
    negativer Wert und laesst sich auch nicht um-typedeffen?

    2. Ein gettid() funktioniert bei mir gar nicht, ist diese nicht in
    <pthread.h> enthalten?

    3. Wie lasse ich mir zB die "Thread ID" ausgeben oder ist das schon
    der Wert den ich in pthread_t Variablen speichere?

    4. Ich dachte dass Linux (Kernel 2.6.18) nun "wirkliche" Threads im
    Userspace unterstuetzt, warum haben diese dann ploetzlich jeweils
    eine andere PID?

    Auch hier: Danke im voraus. 🙂



  • alles im umgang mit pthreads findest du doch auf pronix.de

    zu 4.: natürlich sind das wirkliche threads!



  • Fabeltier schrieb:

    1. Warum ist eine pthread_t Variable fasst immer ein sehr grosser
    negativer Wert und laesst sich auch nicht um-typedeffen?

    Weil du wohl was flasch machst?!

    Fabeltier schrieb:

    2. Ein gettid() funktioniert bei mir gar nicht, ist diese nicht in
    <pthread.h> enthalten?

    Hast du auch nur einmal in die manpage geguckt?

    man gettid schrieb:

    Glibc does not provide a wrapper for this system call; call it using syscall(2).

    Fabeltier schrieb:

    3. Wie lasse ich mir zB die "Thread ID" ausgeben oder ist das schon
    der Wert den ich in pthread_t Variablen speichere?

    gettif ist schon richtig. pthread_t ist nur ein Handle.

    Fabeltier schrieb:

    4. Ich dachte dass Linux (Kernel 2.6.18) nun "wirkliche" Threads im
    Userspace unterstuetzt, warum haben diese dann ploetzlich jeweils
    eine andere PID?

    Kann es auch und macht es nicht 😉

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/syscall.h>
    #include <pthread.h>
    #include <unistd.h>
    
    void * thread(void *arg)
    {
    	sleep(1);
    	printf("T self: %lu\n", pthread_self());
    	printf("T tid: %lu\n", syscall(SYS_gettid));
    	printf("T pid: %u\n", getpid());
    	sleep(60);
    	return 0;
    }
    
    int main()
    {
    	pthread_t tid;
    
    	printf("Current proccess: %u\n", getpid());
    
    	pthread_create(&tid, NULL, thread, NULL);
    
    	printf("Started thread: %lu\n", tid);
    
    	pthread_join(tid, NULL);
    
    	return 0;
    }
    

    Gab bei mir

    Current proccess: 3385
    Started thread: 1082132816
    T self: 1082132816
    T tid: 3387
    T pid: 3385
    

    Und ein pstree dafür ergab:

    test_p,3385
      `-{test_p},3387
    

    Wobei in top die 3387 nicht erscheint.



  • Weil du wohl was flasch machst?!

    Leaglopex, you made my day!! Die Antwort is ja wohl nur noch genial!!!!
    Vielen Dank auch! 😉

    printf("T tid: %lu\n", syscall(SYS_gettid));
    

    Viva! Sowas wollt ich hier sehen!!! 👍 👍 👍


Anmelden zum Antworten