Dela via


Bläddring av väntekedja

Med WCT (Wait Chain Traversal) kan felsökare diagnostisera programlåsningar och dödlägen.

En väntekedja är en alternerande sekvens med trådar och synkroniseringsobjekt där varje tråd väntar på det objekt som följer. Varje objekt som följer ägs i sin tur av den efterföljande tråden i kedjan.

En tråd väntar på ett synkroniseringsobjekt från den tidpunkt då tråden begär objektet tills det hämtas. Det här låset ägs av en tråd från det att tråden hämtar den tills tråden släpper den. Med andra ord, när tråd 1 väntar på ett lås som ägs av tråd 2, är tråd 1 väntar på tråd 2.

WCT stöder följande synkroniseringspri primitiver:

Om du vill hämta väntekedjan för en eller flera trådar skapar du en WCT-session med hjälp av funktionerna OpenThreadWaitChainSession och GetThreadWaitChain. WCT-sessioner representeras av ett handtag av typen HWCT.

Sessioner kan vara synkrona eller asynkrona

Du kan inte avbryta synkrona sessioner och blockera den anropande tråden förrän en väntekedja har hämtats.

Asynkrona sessioner blockerar inte den anropande tråden och kan avbrytas av programmet med hjälp av funktionen CloseThreadWaitChainSession. Resultat från asynkrona åtgärder görs tillgängliga via en WaitChainCallback- återanropsfunktion som tillhandahålls av programmet.

För asynkrona sessioner kan anroparen ange en pekare till en kontextdatastruktur via GetThreadWaitChain. Samma pekare skickas till funktionen WaitChainCallback motringning.

Kontextdatastrukturen är användardefinierad och ogenomskinlig för WCT. Kontextdatastrukturen kan användas av programmet för att kommunicera kontext mellan en WCT-fråga och en återanropsfunktion. Vanligtvis skickar du en händelsereferens genom den här strukturen och när återanropet körs signaleras den här händelsen och en övervakningstråd informeras om att frågan har slutförts.

Ett exempel på bläddring av väntekedja finns i Using WCT.

Se även