Thread kontrolliert beenden



  • Zu: Warum soll der Thread hängenbleiben?
    Wenn sich (aus irgendeinem Grund) der Thread nicht selber beenden sollte, wartet der Hauptthread logischerweise endlos-lange. Das bezeichne ich als hängenbleiben...

    Bei mir gab es mit TerminateThread noch nie einen dead-lock. Schien mir ziemlich speziell zu sein, mit dem printf. Wenn beide Threads printf benutzen und wenn der eine Thread suspended wird und und und...

    Da nehm ich dieses (für mich geringeres) Risiko des Deadlocks auf mich. Wie soll man einen Thread auch sonst zwangs-beenden??



  • Badestrand schrieb:

    Da nehm ich dieses (für mich geringeres) Risiko des Deadlocks auf mich. Wie soll man einen Thread auch sonst zwangs-beenden??

    man könnte ihn z.b. abschiessen. wenn der in irgend'ner systemfunktion festsitzt und niemals an deinem bool 'please_exit' vorbeikommt, kannste mit 'SetThreadContext' seinen pc von ausserhalb auf 0 setzen, das sollte ihn augenblicklich killen (musst ihn natürlich in einen exception handler einpacken und im __except-pfad steht dann ein return).

    bleibt nur noch die frage, ob das nicht genauso fies ist wie ein 'TerminateThread' 😉

    kleine berichtigung: der thread darf natürlich nicht im wait-state festhängen damit das funzt...



  • Badestrand schrieb:

    Wenn sich (aus irgendeinem Grund) der Thread nicht selber beenden sollte

    , musst du den Grund suchen...TerminateThread ist, wie Jochen schon sagte: 👎



  • Badestrand schrieb:

    Wenn sich (aus irgendeinem Grund) der Thread nicht selber beenden sollte

    Das ist für mich genau der Punkt: Such doch bitte nach dem Fehler, warum sich der Thread nicht beendet und murks nicht an anderere Stelle um den Fehler rum.



  • Hallo,

    erstmal Danke für das Interesse an diesem Thread, es werden hier viele gute Dinge aufgegriffen.
    Ich hab mir die letzten Stunden evt. eine etwas bessere Variante einfallen lassen. Es gibt nicht mehr nur boolische Variablen sondern eine einzige Int-Variable und eine einzige bool Variable.
    Die bool Variable initiiert den Shutdown-Vorgang, der entsprechend in (ALLEN) Threads bearbeitet wird.
    Sollte ein Thread beginnen wird die Int-Variable erhöht, sollte ein Thread beendet werden (legitim) wird diese um 1 erniedrigt.

    => DLL-Loader Prinzip

    Parallel wird gewartet, bis die Int-Variable (anz. der offenen Threads) bei null angelangt ist. Sollte dies nicht innerhalb 10(bzw. auch 0.5) Sekunden geschehen, werden alle Threads per TerminateThread manuell beendet (als Sicherung während der Programmierung, für die Fehlersuche!! 😉 )

    Bye



  • JayJay schrieb:

    Sollte ein Thread beginnen wird die Int-Variable erhöht, sollte ein Thread beendet werden (legitim) wird diese um 1 erniedrigt.

    Dies darfst Du dann aber nur mit den "Interlocked"-Funktionen machen!

    Aber dann kannst Du eigentlich gleiche Semaphore verwenden, da kannst Du auch drauf warten.

    Aber das ist wie oben erwähnt bei Threads gar nicht nötig, da Du auf das Handle des Threads einfach warten kannst (oder auch auf mehrere).

    JayJay schrieb:

    werden alle Threads per TerminateThread manuell beendet (als Sicherung während der Programmierung, für die Fehlersuche!! 😉 )

    Wie gesagt: ich kann es nicht verstehen, dass man Threads abschiessen muss... ok, nur wenn man zu faul ist den Fehler zu suchen...



  • JayJay schrieb:
    werden alle Threads per TerminateThread manuell beendet (als Sicherung während der Programmierung, für die Fehlersuche!! 😉 )

    Wie gesagt: ich kann es nicht verstehen, dass man Threads abschiessen muss... ok, nur wenn man zu faul ist den Fehler zu suchen...

    Naja wie gesagt, zu letzt werden diese Dinge komplett entfernt!! 😉



  • Achja, wie soll ich eig. das verstehen?

    Dies darfst Du dann aber nur mit den "Interlocked"-Funktionen machen!



  • InterlockedIncrement
    InterlockedDecrement



  • JayJay schrieb:

    Achja, wie soll ich eig. das verstehen?

    Dies darfst Du dann aber nur mit den "Interlocked"-Funktionen machen!

    In etwa so 😉 : http://www.winapi.net/index.php?inhalt=t1


Anmelden zum Antworten