Attraversamento della catena di attesa
L'attraversamento della catena di attesa (WCT) consente ai debugger di diagnosticare i blocchi e i deadlock dell'applicazione.
Una catena di attesa è una sequenza alternata di thread e oggetti di sincronizzazione in cui ogni thread attende l'oggetto che segue. Ogni oggetto che segue è, a sua volta, di proprietà del thread successivo nella catena.
Un thread attende un oggetto di sincronizzazione dal momento in cui il thread richiede l'oggetto fino a quando non viene acquisito. Questo blocco è di proprietà di un thread dal momento in cui il thread lo acquisisce, fino a quando il thread non lo rilascia. In altre parole, quando il thread 1 attende un blocco di proprietà del thread 2, il thread 1 è in attesa del thread 2.
WCT supporta le primitive di sincronizzazione seguenti:
- Chiamata di procedura locale avanzata (ALPC)
- Microsoft Component Object Model (COM)
- Oggetti sezione critica
- Oggetti Mutex
- Funzione SendMessage
- Operazioni di attesa su processi e thread
Per recuperare la catena di attesa per uno o più thread, creare una sessione WCT usando le funzioni OpenThreadWaitChainSession e GetThreadWaitChain . Le sessioni WCT sono rappresentate da un handle di tipo HWCT.
Le sessioni possono essere sincrone o asincrone
Non è possibile annullare sessioni sincrone e bloccare il thread chiamante finché non viene recuperata una catena di attesa.
Le sessioni asincrone non bloccano il thread chiamante e possono essere annullate dall'applicazione usando la funzione CloseThreadWaitChainSession . I risultati delle operazioni asincrone vengono resi disponibili tramite una funzione di callback WaitChainCallback fornita dall'applicazione.
Per le sessioni asincrone, il chiamante può specificare un puntatore a una struttura di dati di contesto tramite GetThreadWaitChain. Questo stesso puntatore viene passato alla funzione di callback WaitChainCallback .
La struttura dei dati di contesto è definita dall'utente e opaca per WCT. La struttura dei dati di contesto può essere usata dall'applicazione per comunicare il contesto tra una query WCT e una funzione di callback. In genere, si passa un handle di evento tramite questa struttura e, quando viene eseguito il callback, questo evento viene segnalato e un thread di monitoraggio viene informato che la query è stata completata.
Per un esempio di attraversamento della catena di attesa, vedere Uso di WCT.