Anzeige:
Ergebnis 1 bis 9 von 9

Thema: ein Thread zuviel oder nicht ?

  1. #1
    Registrierter Benutzer
    Registriert seit
    31.08.2002
    Ort
    Berlin
    Beiträge
    128

    ein Thread zuviel oder nicht ?

    Hi
    ich erstelle mittels:
    Code:
    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    19.05.2004
    Beiträge
    7
    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...

  3. #3
    Registrierter Benutzer
    Registriert seit
    11.03.2004
    Beiträge
    40
    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

  4. #4
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    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.

    Code:
    #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:
    Code:
    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.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  5. #5
    Registrierter Benutzer
    Registriert seit
    11.03.2004
    Beiträge
    40
    Original geschrieben von panzi
    Da halte ich dagegen.

    Code:
    [...]
    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

  6. #6
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    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

  7. #7
    Registrierter Benutzer
    Registriert seit
    31.08.2002
    Ort
    Berlin
    Beiträge
    128
    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

  8. #8
    Registrierter Benutzer
    Registriert seit
    19.05.2004
    Beiträge
    7
    *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

  9. #9
    Registrierter Benutzer
    Registriert seit
    31.08.2002
    Ort
    Berlin
    Beiträge
    128
    Die Seite habe ich gefunden da wird das alles erklärt http://pronix.de/modules/C/linux/

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •