Doorkruising van wachtketen
Met WCT (Wait Chain Traversal) kunnen foutopsporingsprogramma's vastlopen en impasses van toepassingen diagnosticeren.
Een wachtketen is een afwisselende reeks threads en synchronisatieobjecten waarbij elke thread wacht op het object dat volgt. Elk object dat volgt, is op zijn beurt eigendom van de volgende thread in de keten.
Een thread wacht op een synchronisatieobject vanaf het moment dat de thread het object aanvraagt totdat het is verkregen. Dit vergrendelen eigendom is van een thread vanaf het moment dat de thread deze verkrijgt, totdat de thread deze vrijgeeft. Met andere woorden, wanneer thread 1 wacht op een vergrendeling die eigendom is van thread 2, wordt thread 1 wachten op thread 2.
WCT ondersteunt de volgende synchronisatieprimitief:
- advanced local procedure call (ALPC)
- COM- (Microsoft Component Object Model)
- kritieke sectieobjecten
- Mutex-objecten
- de functie SendMessage
- Wachten bewerkingen op processen en threads
Als u de wachtketen voor een of meer threads wilt ophalen, maakt u een WCT-sessie met behulp van de functies OpenThreadWaitChainSession en GetThreadWaitChain. WCT-sessies worden vertegenwoordigd door een ingang van het type HWCT.
Sessies kunnen synchroon of asynchroon zijn
U kunt synchrone sessies niet annuleren en de aanroepende thread blokkeren totdat een wachtketen is opgehaald.
Asynchrone sessies blokkeren de aanroepende thread niet en kunnen worden geannuleerd door de toepassing met behulp van de functie CloseThreadWaitChainSession. Resultaten van asynchrone bewerkingen worden beschikbaar gesteld via een WaitChainCallback callback-functie die door de toepassing wordt geleverd.
Voor asynchrone sessies kan de aanroeper een aanwijzer opgeven naar een contextgegevensstructuur via GetThreadWaitChain. Dezelfde aanwijzer wordt doorgegeven aan de WaitChainCallback callback-functie.
De contextgegevensstructuur is door de gebruiker gedefinieerd en ondoorzichtig voor WCT. De contextgegevensstructuur kan door de toepassing worden gebruikt om context te communiceren tussen een WCT-query en een callback-functie. Normaal gesproken geeft u een gebeurtenisgreep door via deze structuur en, wanneer de callback wordt uitgevoerd, wordt deze gebeurtenis gesignaleerd en wordt er een bewakingsthread geïnformeerd dat de query is voltooid.
Zie WCT-gebruiken voor een voorbeeld van wachtketenkruising.