Wartekette traversal

Wait Chain Traversal (WCT) ermöglicht Debuggern die Diagnose von Anwendungshängern und Deadlocks.

Eine Wartekette ist eine abwechselnde Sequenz von Threads und Synchronisierungsobjekten, bei der jeder Thread auf das folgende Objekt wartet. Jedes folgende Objekt ist wiederum im Besitz des nachfolgenden Threads in der Kette.

Ein Thread wartet auf ein Synchronisierungsobjekt von dem Zeitpunkt, zu dem der Thread das Objekt anfordert, bis es abgerufen wurde. Diese Sperre gehört einem Thread ab dem Zeitpunkt, zu dem der Thread sie abruft, bis sie vom Thread freigegeben wird. Anders ausgedrückt: Wenn Thread 1 auf eine Sperre wartet, die thread 2 gehört, wartet Thread 1 auf Thread 2.

WCT unterstützt die folgenden Synchronisierungsgrundsätze:

Um die Wartekette für einen oder mehrere Threads abzurufen, erstellen Sie mithilfe der Funktionen OpenThreadWaitChainSession und GetThreadWaitChain eine WCT-Sitzung . WCT-Sitzungen werden durch ein 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 Wartekette abgerufen wurde.

Asynchrone Sitzungen blockieren den aufrufenden Thread nicht und können von der Anwendung mithilfe der CloseThreadWaitChainSession-Funktion abgebrochen werden. Ergebnisse aus asynchronen Vorgängen werden über eine Von der Anwendung bereitgestellte WaitChainCallback-Rückruffunktion zur Verfügung gestellt.

Bei asynchronen Sitzungen kann der Aufrufer über GetThreadWaitChain einen Zeiger auf eine Kontextdatenstruktur angeben. Derselbe Zeiger wird an die Rückruffunktion WaitChainCallback übergeben.

Die Kontextdatenstruktur ist benutzerdefinierte und für WCT undurchsichtig. 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. Wenn der Rückruf ausgeführt wird, wird dieses Ereignis signalisiert, und ein Überwachungsthread wird darüber informiert, dass die Abfrage abgeschlossen wurde.

Ein Beispiel für den Wartekettendurchlauf finden Sie unter Verwenden von WCT.

Siehe auch