Przechodzenie łańcucha oczekiwania
Przechodzenie łańcucha oczekiwania (WCT) umożliwia debugerom diagnozowanie zawieszania i zakleszczenia aplikacji.
Łańcuch oczekiwania to zmienna sekwencja wątków i obiektów synchronizacji, w której każdy wątek czeka na następujący obiekt. Każdy z poniższych obiektów jest z kolei własnością kolejnego wątku w łańcuchu.
Wątek czeka na obiekt synchronizacji od momentu żądania obiektu przez wątek do momentu jego uzyskania. Ta zablokować jest własnością wątku od momentu, gdy wątek go uzyska, aż wątek go zwolni. Innymi słowy, gdy wątek 1 czeka na blokadę należącą do wątku 2, wątek 1 jest oczekiwania dla wątku 2.
Funkcja WCT obsługuje następujące typy pierwotne synchronizacji:
- zaawansowane lokalne wywołanie procedury (ALPC)
- modelu obiektów składników firmy Microsoft (COM)
- obiekty sekcji Krytyczne
- obiektów Mutex
- funkcji SendMessage
- Operacje oczekiwania na procesy i wątki
Aby pobrać łańcuch oczekiwania dla co najmniej jednego wątku, utwórz sesję WCT przy użyciu funkcji OpenThreadWaitChainSession i funkcji GetThreadWaitChain. Sesje WCT są reprezentowane przez dojście typu HWCT.
Sesje mogą być synchroniczne lub asynchroniczne
Nie można anulować sesji synchronicznych i zablokować wątek wywołujący, dopóki łańcuch oczekiwania nie zostanie pobrany.
Sesje asynchroniczne nie blokują wątku wywołującego i można je anulować za pomocą funkcji CloseThreadWaitChainSession. Wyniki operacji asynchronicznych są udostępniane za pośrednictwem WaitChainCallback funkcji wywołania zwrotnego udostępnianej przez aplikację.
W przypadku sesji asynchronicznych obiekt wywołujący może określić wskaźnik do struktury danych kontekstu za pomocą GetThreadWaitChain. Ten sam wskaźnik jest przekazywany do funkcji WaitChainCallback wywołania zwrotnego.
Struktura danych kontekstowych jest definiowana przez użytkownika i nieprzezroczysta do WCT. Struktura danych kontekstowych może być używana przez aplikację do komunikowania kontekstu między zapytaniem WCT i funkcją wywołania zwrotnego. Zazwyczaj przekazujesz dojście zdarzeń za pośrednictwem tej struktury, a po wykonaniu wywołania zwrotnego to zdarzenie jest sygnalizowane, a wątek monitorowania jest informowany o zakończeniu zapytania.
Aby zapoznać się z przykładem przechodzenia łańcucha oczekiwania, zobacz Using WCT.