Wait Chain Traversal
Wait Chain Traversal (WCT) ermöglicht Debuggern, Anwendungshänger und Deadlocks zu diagnostizieren.
Eine Wait Chain ist eine abwechselnde Abfolge von Threads und Synchronisierungsobjekten, bei denen jeder Thread auf das folgende Objekt wartet. Jedes folgende Objekt ist wiederum im Besitz des nachfolgenden Threads in der Kette.
Ein Thread wartet ab dem Zeitpunkt, an dem der Thread das Objekt anfordert, bis es abgerufen wurde, auf ein Synchronisierungsobjekt. Diese Sperre gehört einem Thread ab dem Zeitpunkt, zu dem der Thread sie erhält, bis der Thread sie loslässt. Mit anderen Worten: Wenn Thread 1 auf eine Sperre wartet, die im Besitz von Thread 2 ist, wartet Thread 1 auf Thread 2.
WCT unterstützt die folgenden Synchronisierungsgrundtypen:
- Aufruf der erweiterten lokalen Prozedur (ALPC)
- Microsoft Component Object Model (COM)
- Kritische Abschnittsobjekte
- Mutex-Objekte
- SendMessage-Funktion
- Wartevorgänge für Prozesse und Threads
Um die Wait Chain für einen oder mehrere Threads abzurufen, erstellen Sie eine WCT-Sitzung mithilfe der Funktionen OpenThreadWaitChainSession und GetThreadWaitChain. WCT-Sitzungen werden durch einen Handle vom Typ HWCT dargestellt.
Sitzungen können synchron oder asynchron sein
Sie können synchrone Sitzungen nicht abbrechen und den aufrufenden Thread blockieren, bis eine Wait Chain abgerufen wurde.
Asynchrone Sitzungen blockieren den aufrufenden Thread nicht und können von der Anwendung mithilfe der CloseThreadWaitChainSession-Funktion abgebrochen werden. Ergebnisse von asynchronen Vorgängen werden über eine von der Anwendung bereitgestellte WaitChainCallback-Rückruffunktion verfügbar gemacht.
Bei asynchronen Sitzungen kann der Aufrufer einen Zeiger auf eine Kontextdatenstruktur über GetThreadWaitChain angeben. Dieser Zeiger wird an die WaitChainCallback-Rückruffunktion übergeben.
Die Kontextdatenstruktur ist benutzerdefinierte und undurchsichtig für WCT. Die Kontextdatenstruktur kann von der Anwendung verwendet werden, um den Kontext zwischen einer WCT-Abfrage und einer Rückruffunktion zu kommunizieren. In der Regel übergeben Sie ein Ereignishandle über diese Struktur, und wenn der Rückruf ausgeführt wird, wird dieses Ereignis signalisiert, und ein Überwachungsthread wird informiert, dass die Abfrage abgeschlossen wurde.
Ein Beispiel für das Durchlaufen der Wait Chain finden Sie unter Verwenden von WCT.