Suspendere Sie niemals einen Thread im eigenen Prozess!

Ein Kunde hatte ein langjähriges, aber selten auftretendes Problem mit einem Hängenbleiben: Sein UI-Thread rief den Kernel auf, und der Aufruf hing einfach ohne ersichtlichen Grund fest. Leider konnte der Kernel-Dump keinen Stack aus dem Benutzermodus anzeigen, da der Stack ausgelagert worden war. (Das ist sinnvoll, da ein blockierter Thread seinen Stack nicht verwendet, daher wird dieser Stack ausgelagert, sobald das System unter Speicherplatzmangel leidet.) Die Untersuchung ergab einen Watchdog-Thread, der den UI-Thread periodisch anhält, um eine Stack-Trace zu erfassen, aber dieses Mal hing er über fünf Stunden lang fest. Die Ursache: Eine Deadlock-Situation. Der Watchdog-Thread versucht, eine Stack-Trace des UI-Threads zu erhalten, benötigt aber ein Lock für die Funktionstabelle, während der UI-Thread angehalten und das Lock besitzt. Der Artikel betont, dass man niemals einen Thread in seinem eigenen Prozess anhalten sollte, da dies zu Deadlocks aufgrund von Ressourcenkonflikten führen kann. Um einen Thread anzuhalten und Stacks davon zu erfassen, muss dies von einem anderen Prozess aus erfolgen, um Deadlocks zu vermeiden.
Mehr lesen