Frage zu POSIX-Threads (OS-unabhängig - hoffentlich)
-
Hi,
Ich habe ein Problem zum Verhalten von Posix-Threads.
Wenn man mit denen programmiert hat man ja am Anfang immer einen "main-Thread" (der in der Main-Funktion "abläuft"). Wenn ich *unter Linux* einen weiteren Thread kreiere, in dem dann mit pthread_join() auf die Terminierung dieses "main-Threads" warte, so läuft der Prozess immer noch, bis schließlich auch der zweite Thread terminiert.
Aber wie ist es auf einem allgemeinen OS? Also Windows, Mac, irgendwelche Unix, etc.: Garantiert mir die Posix Thread API, dass nach Terminierung des "main-Threads" immer noch die Terminierung aller anderen Threads abgewartet werden, bis mein Programm endet?
Vielen Dank schon im Voraus für Antworten!
Gruß,
Johannes@Admins: Bitte bei Möglichkeit *nicht* in ein Unix- oder Windows-Board schieben, die Frage ist gerade, ob man eine allgemeine Aussage für alle OS machen kann.
-
in dem dann mit pthread_join() auf die Terminierung dieses "main-Threads"
Das wirkt seltsam. Wie machst du das mit Code?
Normalerweise: Wenn das Ende der main-Funktion erreicht wird oder exit aufgerufen wird (oder ein Signal ...), dann wird der Prozess unter Linux beendet, einschliesslich noch laufender Threads. Dieses Verhalten ist glaube nicht Teil des Standards, da hier kein Teil der API zum Tragen kommt.
Ansonsten: POSIX ist ein Standard. Alle standardkonformen Implementierungen verhalten sich "gleich". Abweichungen werden explizit aufgefuehrt. Generell kann man natuerlich keine Aussagen fuer alle Betriebssysteme oder gar Implementiereungen des Standards machen, da das nicht in den Bereich des Standardgremiums faellt.
-
Hi,
sorry, Du hast recht, das ganze Programm wird tatsächlich am ende der main() beendet (Gerade ein Sample-Programm geschrieben, ich war mir eigentlich sicher, dass das nicht so wäre)...
Aber noch eine Frage: was passiert nun mit dem anderen Thread, der dann noch läuft? wird er von der pthread-lib "gekilled"?
Hier das Beispiel-Programm:
#include <pthread.h> #include <unistd.h> // for sleep() #include <stdio.h> // for puts() pthread_t main_id; void* run_child(void* pointer) { sleep(1); puts("calling pthread_join()"); // erscheint niemals! pthread_join(main_id, NULL); sleep(5); return NULL; } int main() { pthread_t child_id; main_id = pthread_self(); pthread_create(&child_id, NULL, run_child, NULL); puts("main(): goodbye!"); return 0; }
Ausgabe:
main(): goodbye!
Gruß,
Johannes
-
Threads sind Teil des Betriebssystems. POSIX stellt nur eine standardisierte Schnittstelle mit definiertem Verhalten zur Verfuegung. Die verbleibenden Threads werden vom Betriebssystem gekillt.
Die man-page sagt:
The pthread_self() function returns the ID of the calling thread. This is the same value that is returned in *thread in the pthread_create(3) call that created this thread.
Da der "main"-Thread nicht durch die pthread-Bibliothek erzeugt wurde, halte ich den Aufruf von
pthread_self
in der main-Funktion fuer fragwuerdig.
-
Wow, dass sie gekilled werden finde ich echt krass. Dann ist der main thread also doch nicht nur "irgendein" thread. Danke, das war sehr interessant!
EDIT: Hmm das ist aber echt doof mit pthread_self in main(), da man ja manchmal schon wissen will, ob man der main thread ist, oder nicht (gerade darauf zielt ja mein post ab...)