Freigeben über


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:

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.

Siehe auch