Unlock eines CSingleLock von anderem Thread
-
Hallo Leute.
Ich habe einen Thread der uU ein CSingleLock (auf eine CCriticalSection) haelt und diesen Thread muss ich in bestimmten Situationen per TerminateThread abschiessen.
Nun kann es aber sein dass er zu diesem Zeitpunkt gerade das Lock haelt. Kann ich das Lock nun irgendwie ebenfalls killen? Ich kann garantieren dass zu diesem Zeitpunkt nur der tote Thread das lock gehalten hat.
Nur leider weiss ich nicht ob das ueberhaupt moeglich ist ein Unlock aus einem anderen Thread heraus zu machen... Wenn das nicht geht: was kann man sonst sinnvolles tun?
Den Thread muss ich leider abschiessen, da habe ich keine andere Wahl... Und ich weiss auch ob der Thread das lock gehalten hat.
Danke
-
Die Antwort ist ganz eionfach: Verwende kein TerminateThread!
Grundsätzlich: Ein anderer Thread kann keinen Unlock durchführen. So einfachist das und genau aus diesem Grund sollte man niemals TerminateThread verwenden!
Wie solltest Du auch davon ausgehen können, dass die aten die berabeitet wurden noch in einem korrekten Zustand sind... Warum sonst hat wohl der Thread den Lock gesetzt um Daten zu bearbeiten und zu schützen...
Nochmal: Vergiss TerminateThread!
-
Klingt durchaus vernuenftig.
Nur leider bleibt der Thread ab und zu haengen bzw. braucht ewig fuer eine Operation so dass der eben den Rest der Aufgaben blockiert. Die Software stammt aus dem Jahre 1996 und ein neu schreiben kommt da leider nicht in Frage.
Deshalb war mein Ansatz: wenn der Thread laenger als X Zeiteinheiten sich nicht mehr gemeldet hat, dann betrachte ich ihn als festhaengend. Irgendwann wuerde er zwar weiter laufen, aber seine anderen Aufgaben macht er in der Zwischenzeit nicht so dass der Kunde denkt das Programm ist tot und es neustartet.
Nun wollte ich den Thread eben killen um so quasi dem Kunden das neustarten quasi zu automatisieren. Nur ist hier eben das Problem mit dem Lock...
Die offensichtlich korrekte Antwort waere natuerlich den Fehler zu entfernen - der Zeitaufwand waere aber viel zu hoch dafuer. Wie koennte man das sonst noch umgehen? zB die CriticalSection ebenfalls wegwerfen und neu initialisieren?
Danke
-
Shade Of Mine schrieb:
Die offensichtlich korrekte Antwort waere natuerlich den Fehler zu entfernen
Richtig und in sofern ist für mich die Diskussion abgeschlossen.
Shade Of Mine schrieb:
- der Zeitaufwand waere aber viel zu hoch dafuer.
Und woher weißt Du das?
Die Zeit, die Du hier mit Diskussionen und "nicht praktikablen" Lösngen verbringst kannst Du ja schon mal dazurechnen.
Wäre effektiver.Shade Of Mine schrieb:
Wie koennte man das sonst noch umgehen? zB die CriticalSection ebenfalls wegwerfen und neu initialisieren?
Geht nicht.
Zudem scheinst Du nicht zu lesen, was ich geschrieben habe: Wer sagt, dass die Daten, die durch diese Critical Section (die ja durchaus scheinbar Sinn macht) geschützt werden überhaupt noch valide sind? Niemand! Also ist dies keine Lösung... q.e.d.
Für mich EOD
-
Die einzige Lösung, ohne den Source komplett zu ändern. Beende den Prozess mit TerminateProcess und starte ihn neu.
Alle anderen Verusche im gleichen Prozess führen nicht zuverlässig zum Ziel, wie Martin ja schon ausgeführt hat.Beachte auch bitte die ganzen Nebenwirkungen von TerminateThread!!! In meinem (alten) Blog gibt es darüber diverse Ausführungen...