Memoryleak aus Threads?



  • Hi,

    ich habe eine Funktion, welche mir mittels

    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)start_routine,arg,0,&id);
    

    einen neuen Thread erzeugt, dieser Thread seinerseits erzeugt wiederum einen neuen Thread mit der gleichen Funktion kurz bevor er endet. D.h. ich habe eine Kette von Threads, welche immer einen neuen Thread erzeugen und sich selbst beenden.

    Dabei gibt es jetzt ein Problem: Der Speicherverbrauch dieser Applikation geht langsam aber stetig nach oben. Das ist kein Speicherleck innerhalb der Threads, denn dass passiert auch dann, wenn diese nichts anderes tun als immer nur den jeweiligen Nachfolgethread zu erzeugen.

    Was läuft da schief? Unter Linux muss so ein Thread im Status "DETACHED" erzeugt werden - ist das unter Win ähnlich? Und wenn ja: wie mache ich das?


  • Mod



  • CreateThread() legt selber noch einige Daten an, die benötigt werden, um z.B. vom Thread-Ende benachrichtigt zu werden. Diese Daten mußt du mit CloseHandle() wieder freigeben, wenn du sie nicht mehr benötigst.

    PS: Ist es denn wirklich sinnvoll, daß ein Thread als letzte Amtshandlung einen Klon von sich selber startet? Sowas kann man sicher eleganter lösen, indem man die komplette Thread-Funktion in eine Schleife steckt.



  • Das:

    Martin Richter schrieb:

    http://blog.m-ri.de/index.php/2007/11/28/createthread-und-die-crt/

    ist zumindest in meinem Fall grober Unfug, weil das:

    CStoll schrieb:

    CreateThread() legt selber noch einige Daten an, die benötigt werden, um z.B. vom Thread-Ende benachrichtigt zu werden. Diese Daten mußt du mit CloseHandle() wieder freigeben, wenn du sie nicht mehr benötigst.

    mein Problem löst. Danke!



  • The Grid schrieb:

    Das:

    Martin Richter schrieb:

    http://blog.m-ri.de/index.php/2007/11/28/createthread-und-die-crt/

    ist zumindest in meinem Fall grober Unfug, weil das:

    CStoll schrieb:

    CreateThread() legt selber noch einige Daten an, die benötigt werden, um z.B. vom Thread-Ende benachrichtigt zu werden. Diese Daten mußt du mit CloseHandle() wieder freigeben, wenn du sie nicht mehr benötigst.

    mein Problem löst. Danke!

    Und zudem, Martin? Was soll den dass (VC-2005)?? Völlig veraltet!



  • The Grid schrieb:

    Das:

    Martin Richter schrieb:

    http://blog.m-ri.de/index.php/2007/11/28/createthread-und-die-crt/

    ist zumindest in meinem Fall grober Unfug, weil das:

    Es ist überhaupt kein grosser Unfug. Es war bloss dein HANDLE Leak das grössere Problem, und die Verwendung von CreateThread "leakt" wesentlich weniger.
    Du solltest aber trotzdem auf _beginthreadex umsteigen.



  • Und du solltest außerdem über diesen Teil meines oberen Beitrags nachdenken:

    CStoll schrieb:

    PS: Ist es denn wirklich sinnvoll, daß ein Thread als letzte Amtshandlung einen Klon von sich selber startet? Sowas kann man sicher eleganter lösen, indem man die komplette Thread-Funktion in eine Schleife steckt.

    (bzw, was für einen Zweck verfolgst du mit deiner "Thread erzeugt identischen Thread und beendet sich dann selbst"-Konstruktion?)



  • hustbaer schrieb:

    The Grid schrieb:

    Das:

    Martin Richter schrieb:

    http://blog.m-ri.de/index.php/2007/11/28/createthread-und-die-crt/

    ist zumindest in meinem Fall grober Unfug, weil das:

    Es ist überhaupt kein grosser Unfug. Es war bloss dein HANDLE Leak das grössere Problem, und die Verwendung von CreateThread "leakt" wesentlich weniger.
    Du solltest aber trotzdem auf _beginthreadex umsteigen.

    Oh, da sind ja wieder die Gehirnspasten unterwegs! Komisch, das Programm ist mehrere Stunden gelaufen (um eben dieses Leak zu testen), hat in der Zeit nichts weiter gemacht als Threads zu erzeugen und sie wieder sterben zu lassen - und hat dabei nicht ein Byte verloren.

    Aber Hauptsache mal wieder das Forum mit haltlosem Schwachsinn zugespammt...

    The Grid aka Denker



  • CStoll schrieb:

    Und du solltest außerdem über diesen Teil meines oberen Beitrags nachdenken:

    CStoll schrieb:

    PS: Ist es denn wirklich sinnvoll, daß ein Thread als letzte Amtshandlung einen Klon von sich selber startet? Sowas kann man sicher eleganter lösen, indem man die komplette Thread-Funktion in eine Schleife steckt.

    (bzw, was für einen Zweck verfolgst du mit deiner "Thread erzeugt identischen Thread und beendet sich dann selbst"-Konstruktion?)

    Das ist ein wenig schwierig zu erklären. Fakt ist, dieser Threads hat nichts, aber auch gar nichts mit einer Schleife zu tun, da er 1. asynchron zum Rest laufen muss und 2. diese sich-selbst-erzeuge-Geschichte rein optional ist. Sprich der user _kann_ den Thread so benutzen, muss aber nicht. Und eben der normale Anwendungfall, in dem der Thread einmalig was macht ist der Normalfall.



  • Wie intelligent ist es wohl, Tips, zu Themen, von denen man keine Ahnung hat, einfach als groben Unfug abzutun?
    Hm.
    Schwierige Frage.
    Aber ein Denker wie du wird die Antwort sicher früher oder später herausfinden.



  • hustbaer schrieb:

    Wie intelligent ist es wohl, Tips, zu Themen, von denen man keine Ahnung hat, einfach als groben Unfug abzutun?
    Hm.
    Schwierige Frage.
    Aber ein Denker wie du wird die Antwort sicher früher oder später herausfinden.

    Aha. Also soll ich mich mit Problemen beschäftigen, die ich nachweislich nicht habe? Sehr effizient.

    Du kannst ja gerne so arbeiten, ich werde keine Memoryleaks suchen, die ich nicht habe.



  • Denker schrieb:

    Das ist ein wenig schwierig zu erklären. Fakt ist, dieser Threads hat nichts, aber auch gar nichts mit einer Schleife zu tun, da er 1. asynchron zum Rest laufen muss und 2. diese sich-selbst-erzeuge-Geschichte rein optional ist. Sprich der user _kann_ den Thread so benutzen, muss aber nicht. Und eben der normale Anwendungfall, in dem der Thread einmalig was macht ist der Normalfall.

    Also daß dein Thread parallel zum Hauptprogramm laufen soll, kann ich schon verstehen. Was für einen Sinn es macht, daß der Thread sich selber clont, verstehe ich immer noch nicht - du willst wieder zurück zum Anfang, das ist genau der Sinn einer Schleife:

    do
    {
      //mach irgendwas
    }
    while(question("nochmal anfangen?));
    


  • CStoll schrieb:

    Also daß dein Thread parallel zum Hauptprogramm laufen soll, kann ich schon verstehen. Was für einen Sinn es macht, daß der Thread sich selber clont, verstehe ich immer noch nicht - du willst wieder zurück zum Anfang, das ist genau der Sinn einer Schleife:

    do
    {
      //mach irgendwas
    }
    while(question("nochmal anfangen?));
    

    Du weißt schon, dass es einige Gebiete gibt, wo man relativ schlecht mit Schleifen arbeiten kann? Ich sage Rekursion ...

    Allerdings: ist es nicht möglich, dass die Funktion, die an den Thread übergeben wird, sich selbst wieder mit anderen Parametern aufruft, sodass die "Forkbombe" 😉 gar nicht nötig wird?



  • Denker schrieb:

    hustbaer schrieb:

    Wie intelligent ist es wohl, Tips, zu Themen, von denen man keine Ahnung hat, einfach als groben Unfug abzutun?
    Hm.
    Schwierige Frage.
    Aber ein Denker wie du wird die Antwort sicher früher oder später herausfinden.

    Aha. Also soll ich mich mit Problemen beschäftigen, die ich nachweislich nicht habe?

    Nein, du sollst versuchen die Werkzeuge zu verstehen mit denen du arbeitest, und sie so einsetzen, dass sie auch funktionieren wenn mal jemand etwas an dem Projekt ändert. z.B. die Runtime von DLL auf statisch umstellen. Vor allem wenn man es dir schon vorkaut. Die Änderung ist eine Zeile. Aber bitte, lass dich weiter von deiner Arroganz blenden, ich muss dein Programm ja nicht warten.

    Du kannst ja gerne so arbeiten

    Tu ich auch. Ich versuche robuste Programme zu schreiben. Dir ist das egal. Jeder wie er meint.



  • Glühbirne schrieb:

    Du weißt schon, dass es einige Gebiete gibt, wo man relativ schlecht mit Schleifen arbeiten kann? Ich sage Rekursion ...

    Ja, ist mir klar. Aber in vielen Situationen lassen sich Rekursionen (gerade End-Rekursionen, wie die Aussage "dieser Thread seinerseits erzeugt wiederum einen neuen Thread mit der gleichen Funktion kurz bevor er endet" vermuten lässt) recht gut in Schleifen überführen.



  • hustbaer schrieb:

    blenben

    Was? Du nix deutsch? Dann ist mir klar, warum du es beim besten Willen nicht kapierst...



  • jetzt fängt er schon an, sich an Tipfehlern hochzuziehen - dir gehen wohl die vernünftigen Argumente aus?



  • nop slider schrieb:

    Und zudem, Martin? Was soll den dass (VC-2005)?? Völlig veraltet!

    Dumpfkopf!

    Registriere dich oder log dich unter deinem nick ein sobald und sofern du was konstruktives beizutragen hast.

    btw.
    "Was soll denn dass" wäre korrekte Rechtschreibung. 2. Klasse Grundschule oder so.

    z.B.
    Ich atme den Luft. Ich esse den Fisch.
    <->
    Ich atme, denn Luft ist notwendig.



  • Denker schrieb:

    hustbaer schrieb:

    blenben

    Was? Du nix deutsch? Dann ist mir klar, warum du es beim besten Willen nicht kapierst...

    Nah, ich nix deitsch, nix kann sprecht gut, leider. 😞



  • EOP schrieb:

    "Was soll denn dass" wäre korrekte Rechtschreibung.

    "Was soll denn das" wäre korrekte Rechtschreibung.


Log in to reply