Threads löschen

  • Ich benötige mal etwas Hilfe, habe im Netz nichts passendes gefunden. Wie muss ich einen Thread löschen?


    Ich möchte, dass er die Action-Methode ausführt und nach dem Durchlauf eben gelöscht wird.


    Was bewirkt eigentlich "delete this;"?


    Ich habe gelesen, dass delete den Destruktor aufruft und anschließend den Speicher freigibt. Ist das korrekt so?


    Das Problem ist nämlich, dass im Destruktor noch ein cFileName freigegeben werden soll, damit die passende Datei geschlossen wird. Ein "lsof" zeigt mir aber, dass die Datei noch gehalten wird und wohl nicht freigegeben wurde.


    Also, wie muss man solch einen Thread richtig löschen?

    Hardware: AMD Duron 900 MHz, 256 MB Ram, 1 x 400 GB und 2 x 200 GB Maxtor, 1 x 500 GB USB 2.0, Nec DVD-RW ND-3500AG, 1 x TT 1.6 FF DVB-S, 1 x Twinhan Budget DVB-T
    Software: VDR 1.4.1, BigPatch, DMH-DVD-Archive-Patch, Kernel 2.6.12
    ---
    "Hörma, wie heißt nomma dat Instrument mit den 3 Knöppen oben drauf...? - Ja richtig, Flöte!"

  • Deine Annahme ist zunächst richtig, delete object ruft den Destruktor von object auf und gibt dann den Speicher frei.
    EDIT:
    Was natürlich grundsätzlich nur erlaubt ist, wenn das Objekt überhaupt mit new angelegt wurde. Bei einem Stack-Objekt oder non-pointer Member einer Klasse ist das grundsätzlich zum Scheitern verurteilt.


    Grundsätzlich ist Suizid (delete this) in C++ erlaubt, allerdings nur (und da liegt auch schon der Pferdefuß), wenn man 100%ig sicher sein kann, dass danach keinerlei Methoden oder Daten des Objektes mehr angesprochen werden. Um diese Aussage zu treffen musst Du also bereits detaillierte Kenntnis über VDRs Thread-Konzept haben. Soviel vorweg: Die Aussage läuft auf "nicht gegeben" hinaus, da VDR nach dem Auslaufen der Action-Methode noch einen Logeintrag schreibt, der thread->description, thread->running und einige andere anspricht.


    Im Falle eines delete this innerhalb eines VDR-Threads sieht die Sache noch übler aus, denn hier passiert folgendes:
    1. Ein beliebiger Thread startet Deinen Thread (nennen wir ihn A) und führt darin die Action-Methode innerhalb von Thread A aus.
    2. Das Thread-Objekt begeht innerhalb von Thread A durch delete this Suizid
    3. Dein Destruktor wird innerhalb von Thread A durchlaufen
    4. Der Destruktor von cThread wird durchlaufen und ruft Cancel() auf, um sicherzustellen dass der Thread A beendet wurde
    5. Cancel() tötet Thread A, unterbricht ihn damit mitten in Destruktor


    Spätestens ab Punkt 5 sind wir bei undefiniertem Verhalten, da das Objekt nur halb zerstört und nicht freigegeben ist. Das erklärt zwar grundsätzlich nicht das Verbleiben der Datei (es seidenn Du hast selbst noch einen Cancel()-Aufruf im Destruktor), ist aber sicher nicht was Du möchtest.


    Eine gute Möglichkeit um Deine abgelaufenen Threads einzusammeln wäre z.B. cPlugin::Housekeeping(), welche sporadisch aufgerufen wird, oder cPlugin::MainThreadHook(), welche einmal pro Sekunde aufgerufen wird, beide vom Main-Thread aus. Ich benutze im Burn-Plugin einen eigenen Thread, den Manager, um die Job-Threads zu starten und zu stoppen.

  • Vielen Dank schonmal dafür. Tja, so eine Garbage-Collection bei Java beispielseweise ist schon 'ne feine Sache... :D


    Mal sehen, ob dann wohl eher Housekeeping() oder MainThreadHook() zum Tragen kommt.

    Hardware: AMD Duron 900 MHz, 256 MB Ram, 1 x 400 GB und 2 x 200 GB Maxtor, 1 x 500 GB USB 2.0, Nec DVD-RW ND-3500AG, 1 x TT 1.6 FF DVB-S, 1 x Twinhan Budget DVB-T
    Software: VDR 1.4.1, BigPatch, DMH-DVD-Archive-Patch, Kernel 2.6.12
    ---
    "Hörma, wie heißt nomma dat Instrument mit den 3 Knöppen oben drauf...? - Ja richtig, Flöte!"

  • hi,


    Zitat

    Das Problem ist nämlich, dass im Destruktor noch ein cFileName freigegeben werden soll, damit die passende Datei geschlossen wird. Ein "lsof" zeigt mir aber, dass die Datei noch gehalten wird und wohl nicht freigegeben wurde.


    musst du an dieser stelle ueberhaupt das thread objekt loeschen ? reicht es nicht das cFileName objekt am ende der Action() funktion zu loeschen und auf NULL zu setzen, was wiederum for dem loeschen des cFileName objekts im destruktor abgefragt wird ?



    gruesse
    herbsl

  • herbsl: Das stimmt natürlich. Hatte das auch schonmal so gelöst, wollte dann aber wieder möglichst nah an das Original ran. Der Thread basiert nämlich auf dem Cutter-Thread.


    Habe es jetzt mit MainThreadHook() umgesetzt und es funktioniert wirklich gut. Hatte mich schon gefragt, warum der VDR selbst, den Cutting-Thread so eigenartig aufruft, aber das mit dem Suizid wird wohl der Grund gewesen sein. ;)


    Funktioniert jetzt prima. Danke schön.

    Hardware: AMD Duron 900 MHz, 256 MB Ram, 1 x 400 GB und 2 x 200 GB Maxtor, 1 x 500 GB USB 2.0, Nec DVD-RW ND-3500AG, 1 x TT 1.6 FF DVB-S, 1 x Twinhan Budget DVB-T
    Software: VDR 1.4.1, BigPatch, DMH-DVD-Archive-Patch, Kernel 2.6.12
    ---
    "Hörma, wie heißt nomma dat Instrument mit den 3 Knöppen oben drauf...? - Ja richtig, Flöte!"

    Einmal editiert, zuletzt von dmh ()

  • Zitat

    Original von herbsl
    dann hast du doch eine quasi vdr-interne garbage collection, und du hast trotzdem sehnsucht nach java ... :rolleyes:


    Jupp, eigentlich schon. ;( Viele einfache Sachen gehen mir bei C dann eben doch viel zu kompliziert... Aber man kann eben nicht alles haben.


    Aber wichtig ist ja, dass es funktioniert.

    Hardware: AMD Duron 900 MHz, 256 MB Ram, 1 x 400 GB und 2 x 200 GB Maxtor, 1 x 500 GB USB 2.0, Nec DVD-RW ND-3500AG, 1 x TT 1.6 FF DVB-S, 1 x Twinhan Budget DVB-T
    Software: VDR 1.4.1, BigPatch, DMH-DVD-Archive-Patch, Kernel 2.6.12
    ---
    "Hörma, wie heißt nomma dat Instrument mit den 3 Knöppen oben drauf...? - Ja richtig, Flöte!"

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!