Leer en inglés

Compartir a través de


RIO_CQ

La definición de tipo RIO_CQ especifica un descriptor de cola de finalización que se usa para la notificación de finalización de E/S mediante envío y recepción de solicitudes con las extensiones de E/S registradas de Winsock.

typedef struct RIO_CQ_t* RIO_CQ, **PRIO_CQ;

RIO_CQ

Tipo de datos que especifica un descriptor de cola de finalización usado para la notificación de finalización de E/S mediante solicitudes de envío y recepción.

Comentarios

El objeto RIO_CQ se usa para la notificación de finalización de E/S de envío y recepción de solicitudes de red por parte de las extensiones de E/S registradas de Winsock.

Una aplicación puede usar la función RIONotify para solicitar notificaciones cuando una cola de finalización de RIO_CQ no está vacía. Una aplicación también puede sondear el estado en cualquier momento de una cola de finalización de RIO_CQ de forma no bloqueada mediante la función RIODequeueCompletion .

El objeto RIO_CQ se crea mediante la función RIOCreateCompletionQueue . En el momento de la creación, la aplicación debe especificar el tamaño de la cola, que determina cuántas entradas de finalización puede contener. Cuando una aplicación llama a la función RIOCreateRequestQueue para obtener un identificador de RIO_RQ , la aplicación debe especificar un identificador de RIO_CQ para las finalizaciones de envío y un identificador de RIO_CQ para las finalizaciones de recepción. Estos identificadores pueden ser idénticos cuando se debe usar la misma cola para enviar y recibir la finalización. La función RIOCreateRequestQueue también requiere un número máximo de operaciones de envío y recepción pendientes, que se cobran en función de la capacidad de la cola o colas de finalización asociadas. Si las colas no tienen capacidad suficiente, se producirá un error en la llamada RIOCreateRequestQueue con WSAENOBUFS.

El comportamiento de notificación de una cola de finalización se establece cuando se crea el RIO_CQ .

Para una cola de finalización que usa un evento, el miembro Type de la estructura RIO_NOTIFICATION_COMPLETION se establece en RIO_EVENT_COMPLETION. El miembro Event.EventHandle debe contener el identificador de un evento creado por la función WSACreateEvent o CreateEvent . Para recibir la finalización de RIONotify , la aplicación debe esperar al identificador de eventos especificado mediante WSAWaitForMultipleEvents o una rutina de espera similar. Si la aplicación planea restablecer y reutilizar el evento, la aplicación puede reducir la sobrecarga estableciendo el miembro Event.NotifyReset en un valor distinto de cero. Esto hace que la función RIONotify restablezca automáticamente el evento cuando se produzca la notificación. Esto mitiga la necesidad de llamar a la función WSAResetEvent para restablecer el evento entre llamadas a la función RIONotify .

Para una cola de finalización que usa un puerto de finalización de E/S, el miembro Type de la estructura de RIO_NOTIFICATION_COMPLETION se establece en RIO_IOCP_COMPLETION. El miembro Iocp.IocpHandle debe contener el identificador de un puerto de finalización de E/S creado por la función CreateIoCompletionPort . Para recibir la finalización de RIONotify , la aplicación debe llamar a la función GetQueuedCompletionStatus o GetQueuedCompletionStatusEx . La aplicación debe proporcionar un objeto SUPERPUESTO dedicado para la cola de finalización y también puede usar el miembro Iocp.CompletionKey para distinguir las solicitudes RIONotify en la cola de finalización de otras finalizaciones de E/S, incluidas las finalizaciones RIONotify para otras colas de finalización.

Nota

Con fines de eficacia, el acceso a las colas de finalización (RIO_CQ structs) y las colas de solicitudes (RIO_RQ structs) no están protegidos por primitivos de sincronización. Si necesita acceder a una cola de finalización o solicitud desde varios subprocesos, el acceso debe coordinarse mediante una sección crítica, un bloqueo de escritura de lector delgado o un mecanismo similar. Este bloqueo no es necesario para el acceso mediante un único subproceso. Los distintos subprocesos pueden acceder a solicitudes o colas de finalización independientes sin bloqueos. La necesidad de sincronización solo se produce cuando varios subprocesos intentan acceder a la misma cola. La sincronización también es necesaria si varios subprocesos emite y recibe en el mismo socket porque las operaciones de envío y recepción usan la cola de solicitudes del socket.

 

Si varios subprocesos intentan acceder al mismo RIO_CQ mediante RIODequeueCompletion, el acceso debe coordinarse mediante una sección crítica, un bloqueo de escritura de lector fino o un mecanismo de exclusión mutua similar. Si las colas de finalización no se comparten, no se requiere la exclusión mutua.

Cuando ya no se necesita una cola de finalización, una aplicación puede cerrarla mediante la función RIOCloseCompletionQueue .

La definición de tipo RIO_CQ se define en el archivo de encabezado Mswsockdef.h que se incluye automáticamente en el archivo de encabezado Mswsock.h . El archivo de encabezado Mswsockdef.h nunca se debe usar directamente.

Seguridad para subprocesos

Si varios subprocesos intentan acceder al mismo RIO_CQ mediante RIODequeueCompletion, el acceso debe coordinarse mediante una sección crítica, un bloqueo de escritura de lector fino o un mecanismo de exclusión mutua similar. Si las colas de finalización no se comparten, no se requiere la exclusión mutua.

Requisitos

Requisito Value
Cliente mínimo compatible
Windows 8 [solo aplicaciones de escritorio]
Servidor mínimo compatible
Windows Server 2012 [solo aplicaciones de escritorio]
Encabezado
Mswsockdef.h (incluya Mswsock.h)

Consulte también

CreateIoCompletionPort

CreateEvent

GetQueuedCompletionStatus

GetQueuedCompletionStatusEx

COMPROMETIDOS

RIO_NOTIFICATION_COMPLETION

RIO_NOTIFICATION_COMPLETION_TYPE

RIO_RQ

RIOCloseCompletionQueue

RIOCreateCompletionQueue

RIOCreateRequestQueue

RIODequeueCompletion

RIONotify

WSACreateEvent

WSAResetEvent

WSAWaitForMultipleEvents