RIO_CQ
Le typedef RIO_CQ spécifie un descripteur de file d’attente d’achèvement utilisé pour la notification d’achèvement des E/S en envoyant et en recevant des demandes avec les extensions d’E/S inscrites winsock.
typedef struct RIO_CQ_t* RIO_CQ, **PRIO_CQ;
-
RIO_CQ
-
Type de données qui spécifie un descripteur de file d’attente d’achèvement utilisé pour la notification d’achèvement des E/S par envoi et réception de demandes.
Notes
L’objet RIO_CQ est utilisé pour la notification d’achèvement des E/S d’envoi et de réception de demandes réseau par les extensions d’E/S inscrites winsock.
Une application peut utiliser la fonction RIONotify pour demander une notification lorsqu’une file d’attente d’achèvement RIO_CQ n’est pas vide. Une application peut également interroger le status à tout moment d’une file d’attente d’achèvement RIO_CQ de manière non bloquante à l’aide de la fonction RIODequeueCompletion.
L’objet RIO_CQ est créé à l’aide de la fonction RIOCreateCompletionQueue. Au moment de la création, l’application doit spécifier la taille de la file d’attente, qui détermine le nombre d’entrées d’achèvement qu’elle peut contenir. Lorsqu’une application appelle la fonction RIOCreateRequestQueue pour obtenir un handle RIO_RQ , l’application doit spécifier un handle de RIO_CQ pour les achèvements d’envoi et un handle de RIO_CQ pour les achèvements de réception. Ces handles peuvent être identiques lorsque la même file d’attente doit être utilisée pour l’envoi et la réception. La fonction RIOCreateRequestQueue nécessite également un nombre maximal d’opérations d’envoi et de réception en attente, qui sont facturées sur la capacité de la ou des files d’attente d’achèvement associées. Si les files d’attente ne disposent pas d’une capacité suffisante, l’appel RIOCreateRequestQueue échoue avec WSAENOBUFS.
Le comportement de notification d’une file d’attente d’achèvement est défini lors de la création du RIO_CQ .
Pour une file d’attente d’achèvement qui utilise un événement, le membre Type de la structure RIO_NOTIFICATION_COMPLETION est défini sur RIO_EVENT_COMPLETION. Le membre Event.EventHandle doit contenir le handle d’un événement créé par la fonction WSACreateEvent ou CreateEvent . Pour recevoir l’achèvement RIONotify , l’application doit attendre le handle d’événement spécifié à l’aide de WSAWaitForMultipleEvents ou d’une routine d’attente similaire. Si l’application prévoit de réinitialiser et de réutiliser l’événement, l’application peut réduire la surcharge en définissant le membre Event.NotifyReset sur une valeur différente de zéro. Cela entraîne la réinitialisation automatique de l’événement par la fonction RIONotify lorsque la notification se produit. Cela atténue la nécessité d’appeler la fonction WSAResetEvent pour réinitialiser l’événement entre les appels à la fonction RIONotify .
Pour une file d’attente d’achèvement qui utilise un port d’achèvement des E/S, le membre Type de la structure RIO_NOTIFICATION_COMPLETION est défini sur RIO_IOCP_COMPLETION. Le membre Iocp.IocpHandle doit contenir le handle d’un port d’achèvement d’E/S créé par la fonction CreateIoCompletionPort . Pour recevoir l’achèvement RIONotify , l’application doit appeler la fonction GetQueuedCompletionStatus ou GetQueuedCompletionStatusEx . L’application doit fournir un objet OVERLAPPED dédié pour la file d’attente d’achèvement, et elle peut également utiliser le membre Iocp.CompletionKey pour distinguer les demandes RIONotify sur la file d’attente d’achèvement des autres complétions d’E/S, y compris les saisies semi-automatique RIONotify pour d’autres files d’attente d’achèvement.
Notes
Par souci d’efficacité, l’accès aux files d’attente d’achèvement (RIO_CQ structs) et aux files d’attente de requêtes (RIO_RQ structs) n’est pas protégé par des primitives de synchronisation. Si vous devez accéder à une file d’attente d’achèvement ou de demandes à partir de plusieurs threads, l’accès doit être coordonné par une section critique, un verrou d’écriture de lecteur mince ou un mécanisme similaire. Ce verrouillage n’est pas nécessaire pour l’accès par un seul thread. Différents threads peuvent accéder à des files d’attente de requêtes/d’achèvement distinctes sans verrous. La synchronisation est nécessaire uniquement lorsque plusieurs threads tentent d’accéder à la même file d’attente. La synchronisation est également nécessaire si plusieurs problèmes de threads envoient et reçoivent sur le même socket, car les opérations d’envoi et de réception utilisent la file d’attente de demandes du socket.
Si plusieurs threads tentent d’accéder au même RIO_CQ à l’aide de RIODequeueCompletion, l’accès doit être coordonné par une section critique, un verrou d’enregistreur de lecture mince ou un mécanisme d’exclusion mutuelle similaire. Si les files d’attente d’achèvement ne sont pas partagées, l’exclusion mutuelle n’est pas requise.
Lorsqu’une file d’attente d’achèvement n’est plus nécessaire, une application peut la fermer à l’aide de la fonction RIOCloseCompletionQueue .
La RIO_CQ typedef est définie dans le fichier d’en-tête Mswsockdef.h qui est automatiquement inclus dans le fichier d’en-tête Mswsock.h . Le fichier d’en-tête Mswsockdef.h ne doit jamais être utilisé directement.
Cohérence de thread
Si plusieurs threads tentent d’accéder au même RIO_CQ à l’aide de RIODequeueCompletion, l’accès doit être coordonné par une section critique, un verrou d’enregistreur de lecture mince ou un mécanisme d’exclusion mutuelle similaire. Si les files d’attente d’achèvement ne sont pas partagées, l’exclusion mutuelle n’est pas requise.
Spécifications
Condition requise | Valeur |
---|---|
Client minimal pris en charge |
Windows 8 [applications de bureau uniquement] |
Serveur minimal pris en charge |
Windows Server 2012 [applications de bureau uniquement] |
En-tête |
|
Voir aussi