E/S pouvant être alertables
Les E/S pouvant être alertables sont la méthode par laquelle les threads d’application traitent les demandes d’E/S asynchrones uniquement lorsqu’ils sont dans un état pouvant être alerté.
Pour comprendre quand un thread est dans un état alerte, envisagez le scénario suivant :
- Un thread lance une demande de lecture asynchrone en appelant ReadFileEx avec un pointeur vers une fonction de rappel.
- Le thread lance une demande d’écriture asynchrone en appelant WriteFileEx avec un pointeur vers une fonction de rappel.
- Le thread appelle une fonction qui extrait une ligne de données à partir d’un serveur de base de données distant.
Dans ce scénario, les appels à ReadFileEx et WriteFileEx seront probablement retournés avant l’appel de fonction à l’étape 3. Dans ce cas, le noyau place les pointeurs vers les fonctions de rappel dans la file d’attente d’appel de procédure asynchrone (APC) du thread. Le noyau gère cette file d’attente spécifiquement pour contenir les données de requête d’E/S retournées jusqu’à ce qu’elles puissent être traitées par le thread correspondant.
Lorsque l’extraction de ligne est terminée et que le thread retourne à partir de la fonction, sa priorité la plus élevée est de traiter les demandes d’E/S retournées sur la file d’attente en appelant les fonctions de rappel. Pour ce faire, il doit entrer dans un état pouvant être alerté. Un thread ne peut le faire qu’en appelant l’une des fonctions suivantes avec les indicateurs appropriés :
- SleepEx
- WaitForSingleObjectEx
- WaitForMultipleObjectsEx
- SignalObjectAndWait
- MsgWaitForMultipleObjectsEx
Lorsque le thread entre dans un état d’alerte, les événements suivants se produisent :
- Le noyau vérifie la file d’attente APC du thread. Si la file d’attente contient des pointeurs de fonction de rappel, le noyau supprime le pointeur de la file d’attente et l’envoie au thread.
- Le thread exécute la fonction de rappel.
- Les étapes 1 et 2 sont répétées pour chaque pointeur restant dans la file d’attente.
- Lorsque la file d’attente est vide, le thread retourne à partir de la fonction qui l’a placé dans un état alerte.
Dans ce scénario, une fois que le thread entre dans un état d’alerte, il appelle les fonctions de rappel envoyées à ReadFileEx et WriteFileEx, puis retourne à partir de la fonction qui l’a placé dans un état alertable.
Si un thread entre dans un état d’alerte alors que sa file d’attente APC est vide, l’exécution du thread est suspendue par le noyau jusqu’à ce que l’une des opérations suivantes se produise :
- L’objet de noyau qui est attendu est signalé.
- Un pointeur de fonction de rappel est placé dans la file d’attente APC.
Un thread qui utilise des E/S pouvant être alertées traite les demandes d’E/S asynchrones plus efficacement que lorsqu’elles attendent simplement que l’indicateur d’événement dans la structure CHEVAUCHEMENT SOIT défini, et que le mécanisme d’E/S pouvant être alerté est moins compliqué que les ports d’achèvement d’E/ S à utiliser. Toutefois, les E/S pouvant être alertables retournent le résultat de la demande d’E/S uniquement au thread qui l’a lancée. Les ports d’achèvement des E/S n’ont pas cette limitation.
Rubriques connexes