Parcours de chaîne d’attente
Le parcours de chaîne d’attente (WCT) permet aux débogueurs de diagnostiquer les blocages et les suspensions d’application.
Une chaîne d’attente est une séquence alternée de threads et d’objets de synchronisation où chaque thread attend l’objet qui suit. Chaque objet qui suit est, à son tour, possédé par le thread suivant dans la chaîne.
Un thread attend un objet de synchronisation depuis le moment où il en fait la demande jusqu’à ce qu’il soit acquis. Ce verrou est possédé par un thread à partir du moment où le thread l’acquiert, jusqu’à ce que le thread le libère. En d’autres termes, lorsque le thread 1 attend un verrou qui est possédé par le thread 2, le thread 1 est en attente du thread 2.
WCT prend en charge les primitives de synchronisation suivantes :
- Appel de procédure locale avancé (ALPC)
- Microsoft Component Object Model (COM)
- Objets de section critique
- Objets mutex
- Fonction SendMessage
- Opérations Wait sur les processus et les threads
Pour récupérer la chaîne d’attente pour un ou plusieurs threads, créez une session WCT en utilisant les fonctions OpenThreadWaitChainSession et GetThreadWaitChain. Les sessions WCT sont représentées par un handle de type HWCT.
Les sessions peuvent être synchrones ou asynchrones.
Vous ne pouvez pas annuler les sessions synchrones, et elles bloquent le thread appelant, jusqu’à ce qu’une chaîne d’attente ait été récupérée.
Les sessions asynchrones ne bloquent pas le thread appelant et peuvent être annulées par l’application en utilisant la fonction CloseThreadWaitChainSession. Les résultats des opérations asynchrones sont mis à disposition via une fonction de rappel WaitChainCallback fournie par l’application.
Pour les sessions asynchrones, l’appelant peut spécifier un pointeur vers une structure de données de contexte via GetThreadWaitChain. Ce même pointeur est passé à la fonction de rappel WaitChainCallback.
La structure de données de contexte est définie par l’utilisateur et opaque pour WCT. La structure de données de contexte peut être utilisée par l’application pour communiquer le contexte entre une requête WCT et une fonction de rappel. En général, vous passez un handle d’événement via cette structure et, lorsque le rappel est exécuté, cet événement est signalé et un thread de surveillance est informé que la requête a été complétée.
Pour un exemple de parcours de chaîne d’attente, veuillez consulter la section Utilisation de WCT.