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!!!