Partager via


E/S pouvant être alertable

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’elles sont dans un état d’alerte.

Pour comprendre quand un thread est dans un état d’alerte, tenez compte du scénario suivant :

  1. Un thread lance une demande de lecture asynchrone en appelant ReadFileEx avec un pointeur vers une fonction de rappel.
  2. Le thread lance une demande d’écriture asynchrone en appelant WriteFileEx avec un pointeur vers une fonction de rappel.
  3. Le thread appelle une fonction qui récupère une ligne de données à partir d’un serveur de base de données distant.

Dans ce scénario, les appels à ReadFileEx et WriteFileEx retourneront probablement avant l’appel de fonction à l’étape 3. Lorsqu’ils le font, 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 la récupération de ligne est terminée et que le thread retourne de la fonction, sa priorité la plus élevée consiste à 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 un état d’alerte. Un thread ne peut effectuer cette opération qu’en appelant l’une des fonctions suivantes avec les indicateurs appropriés :

Lorsque le thread entre dans un état d’alerte, les événements suivants se produisent :

  1. 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.
  2. Le thread exécute la fonction de rappel.
  3. Les étapes 1 et 2 sont répétées pour chaque pointeur restant dans la file d’attente.
  4. Lorsque la file d’attente est vide, le thread retourne de la fonction qui l’a placée dans un état d’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ée dans un état d’alerte.

Si un thread entre dans un état d’alerte pendant 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 noyau en cours d’attente devient signalé.
  • Un pointeur de fonction de rappel est placé dans la file d’attente APC.

Un thread qui utilise des E/S pouvant être alertables traite les demandes d’E/S asynchrones plus efficacement que lorsqu’ils attendent simplement l’indicateur d’événement dans la structure SE CHEVAUCHER et que le mécanisme d’E/S pouvant être alerté est moins compliqué que ports d’achèvement d’E/S à utiliser. Toutefois, les E/S pouvant être alertables retournent le résultat de la requête d’E/S uniquement au thread qui l’a lancée. Les ports d’achèvement des E/S n’ont pas cette limitation.

appels de procédure asynchrone