PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ein Thread zuviel oder nicht ?



xmarvel
21-05-2004, 15:00
Hi
ich erstelle mittels:
pthread_create(&thread, NULL, _thread, this);
ein neuen Thread der bis zum Ende meines Hauptprogramm in einer endlos while schleife existiert.
Jetzt habe ich zwei Fragen dazu wird der Speicher des Threads automtisch freigegeben wenn ich mein Hauptprogramm beende ?
Und zweitens sehe ich mittels ps -ae drei mal mein Programm obwohl ich doch nur ein Thread neu erstelle habe. Müssten es dann nicht nur zwei zu sehen sein ? Jedes davon hat auch eine eigene PID bekommen ?

MFG
xmarvel

bash
21-05-2004, 18:02
Selbst wenn dein Hauptprogramm beendet ist sollte dein Thread eigentlich weiter laufen... soweit ich das in Erinnerung behalten habe...
Kindprozesse ->fork()<- sterben mit dem Vaterprozess...

bmann
21-05-2004, 21:39
Also .. das sehe ich aber anders.
Threads gehören immer zu einem Prozess, ein Thread kann nicht ohne einen Prozess existieren. Das heisst wenn dein Programm/Prozess beendet wird, werden/sind auch alle Threads beendet.

Ich hab nicht so die Ahnung von threads (und von pthreads im speziellen), es könnte allenfalls sein, dass dein Programm erst beendet, wenn alle threads beendet sind - das sollte sich aber leicht feststellen lassen, indem du einfach einen thread unendlich lange laufen lässt, und die main() funktion sofort beendest. Wenn du jetzt wieder auf der bash zurück bist, wurde dein Programm offenbar beendet.
Ich würde übrigens ne Menge Wetten darauf abschliessen, dass die Threads terminiert werden, sobald main() verlassen wird, ich kann nur auf Anhieb keinen Link finden, der das explizit sagt :)

In diesem Fall ist dann auch der Speicher der zu dem Prozess (und somit den Threads) gehörte freigegeben.

Warum dein Programm allerdings dreimal, statt zweimal auftaucht, weiss ich nicht.

CU
Andi

panzi
22-05-2004, 00:27
Original geschrieben von bmann
Ich würde übrigens ne Menge Wetten darauf abschliessen, dass die Threads terminiert werden, sobald main() verlassen wird, ich kann nur auf Anhieb keinen Link finden, der das explizit sagt :)

Da halte ich dagegen. :)


#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void * trd_funct( void * ptr ) {
puts( "thread start" );

sleep( 10 );

puts( "thread end" );

pthread_exit( NULL );
return NULL;
}

int main( void ) {
pthread_t trd;
int errnum = 0;

puts( "main start" );

errnum = pthread_create( &trd, NULL, &trd_funct, NULL );
if( errnum != 0 ) {
fprintf( stderr, "error: %s\n", strerror( errnum ) );
}

puts( "main end" );
pthread_exit( NULL );
return 0;
}

Ausgabe:
main start
main end
thread start
thread end

Wobei ich schätze das wohl pthread_exit() warten wird (auf die threads). Ohne der Anweisung funktioniert das Prog. nicht "richtig" (es wird eben nicht gewartet, threads sterben). Aber das ist eben fehlerhaft. Also ein korrektes pthread Programm hat immer diese Anweisung!

Wie man's jetzt interpretiert ist halt ansichtssache, also ob beim Ende von main() die anderen threads gekillt werden oder ob main() wartet. Korrekt programmiert wäre das letztere.

bmann
22-05-2004, 01:51
Original geschrieben von panzi
Da halte ich dagegen. :)



[...]
int main( void ) {
[...]
pthread_exit( NULL );
return 0;
}
[...]
Wobei ich schätze das wohl pthread_exit() warten wird (auf die threads). Ohne der Anweisung funktioniert das Prog. nicht "richtig" (es wird eben nicht gewartet, threads sterben). Aber das ist eben fehlerhaft. Also ein korrektes pthread Programm hat immer diese Anweisung!

Wie man's jetzt interpretiert ist halt ansichtssache, also ob beim Ende von main() die anderen threads gekillt werden oder ob main() wartet. Korrekt programmiert wäre das letztere.

Naja, aber genau das hab ich ja gesagt...
Wenn du pthread_exit() explizit in main() aufrufst, verlässt du main() ja eben _nicht_, dann kann auch kein thread vorzeitig beendet werden. Natürlich wartet pthread_exit() bis der thread beendet ist.
Aber es ging ja um die Frage, ob der thread beendet wird, wenn du pthread_exit() _nicht_ aufrufst.

Dass man das nicht so machen sollte ist mir schon klar :-)

CU
Andi

quinte17
22-05-2004, 08:42
im normal fall werden die threads darunter auch terminiert.
dass die ausgabe:

main start
main end
thread start
thread end

so war, ist zum teil reiner zufall gewesen, liegt am sheduler, wieviel zeit für den elternprozess noch übrig ist. thoretisch hätte sich auch folgendes ergeben können:

main start
thread start
thread end
main end

greetz

xmarvel
22-05-2004, 10:42
Naja, aber genau das hab ich ja gesagt...
Wenn du pthread_exit() explizit in main() aufrufst, verlässt du main() ja eben _nicht_, dann kann auch kein thread vorzeitig beendet werden. Natürlich wartet pthread_exit() bis der thread beendet ist.
Aber es ging ja um die Frage, ob der thread beendet wird, wenn du pthread_exit() _nicht_ aufrufst.

Dass man das nicht so machen sollte ist mir schon klar :-)

Ja genau das war die Frage da ich zwar die Funktion pthread_exit() im Thread vorhanden ist aber es eigentlich nie aufgerufen wird. (Wegen der Endlosschleife).
Stirb der Thread sogesagt wenn ich mein Hauptprogramm beende und da war die Frage ob sich der Speicherbereich automatisch freigibt ?
Noch übriggebliebene Prozesse oder Zombies oder ähnlichem habe ich wenn das Programm beendet habe nicht.

Bleibt eigentlich nur noch die Frage warum ich drei Prozesse sehe anstatt eigentlich zwei ?

MFG
xmarvel

bash
24-05-2004, 09:43
*grübel*
Threads sind doch eigenständige Prozesse und sollten nicht sterben, wenn das Hauptprogramm beendet ist...
Ich habe mit Perl sehr oft mit Threads gearbeitet und da war das so...

Im gegensatz zu Kind-Prozessen, die zum Beispiel mit fork() erstellt werden. Die sterben, wenn der Vaterprozess beendet wird...

Vielleicht reden wir ja auch aneinander vorbei ;)


Andy
:D

xmarvel
24-05-2004, 12:06
Die Seite habe ich gefunden da wird das alles erklärt http://pronix.de/modules/C/linux/