RIO_CQ

RIO_CQ typedef 指定一个完成队列描述符,该描述符通过使用 Winsock 注册的 I/O 扩展发送和接收请求来发送 I/O 完成通知。

typedef struct RIO_CQ_t* RIO_CQ, **PRIO_CQ;

RIO_CQ

一种数据类型,指定用于发送和接收请求的 I/O 完成通知的完成队列描述符。

备注

RIO_CQ 对象用于 Winsock 注册的 I/O 扩展发送和接收网络请求的 I/O 完成通知。

RIO_CQ完成队列不为空时,应用程序可以使用 RIONotify 函数请求通知。 应用程序还可以随时使用 RIODequeueCompletion 函数以非阻塞方式轮询RIO_CQ完成队列的状态。

RIO_CQ 对象是使用 RIOCreateCompletionQueue 函数创建的。 在创建时,应用程序必须指定队列的大小,从而确定它可以保留多少个完成项。 当应用程序调用 RIOCreateRequestQueue 函数以获取 RIO_RQ 句柄时,应用程序必须为发送完成指定 RIO_CQ 句柄,为接收完成指定 RIO_CQ 句柄。 当应将同一队列用于发送和接收完成时,这些句柄可能相同。 RIOCreateRequestQueue 函数还需要最大数目的未完成发送和接收操作,这些操作根据关联的完成队列或队列的容量收费。 如果队列没有足够的剩余容量, 则 RIOCreateRequestQueue 调用将失败并出现 WSAENOBUFS

完成队列的通知行为是在创建 RIO_CQ 时设置的。

对于使用 事件的完成队列,RIO_NOTIFICATION_COMPLETION 结构的 Type 成员设置为 RIO_EVENT_COMPLETIONEvent.EventHandle 成员应包含由 WSACreateEventCreateEvent 函数创建的事件的句柄。 若要接收 RIONotify 完成,应用程序应使用 WSAWaitForMultipleEvents 或类似的等待例程等待指定的事件句柄。 如果应用程序计划重置并重复使用事件,则应用程序可以通过将 Event.NotifyReset 成员设置为非零值来减少开销。 这会导致发生通知时 RIONotify 函数自动重置事件。 这可减少调用 WSAResetEvent 函数以在调用 RIONotify 函数之间重置事件的需求。

对于使用 I/O 完成端口的完成队列,RIO_NOTIFICATION_COMPLETION结构的 Type 成员设置为 RIO_IOCP_COMPLETIONIocp.IocpHandle 成员应包含 CreateIoCompletionPort 函数创建的 I/O 完成端口的句柄。 若要接收 RIONotify 完成,应用程序应调用 GetQueuedCompletionStatusGetQueuedCompletionStatusEx 函数。 应用程序应为完成队列提供专用 的 OVERLAPPED 对象,并且它还可以使用 Iocp.CompletionKey 成员将完成队列上的 RIONotify 请求与其他 I/O 完成请求(包括其他完成队列的 RIONotify 完成)区分开来。

注意

为了提高效率,对完成队列的访问 (RIO_CQ 结构) 和请求队列 (RIO_RQ 结构) 不受同步基元的保护。 如果需要从多个线程访问完成队列或请求队列,应通过关键部分、超薄读取器写入锁或类似机制协调访问。 单个线程访问不需要此锁定。 不同的线程可以在没有锁的情况下访问单独的请求/完成队列。 仅当多个线程尝试访问同一队列时,才需要同步。 如果多个线程在同一套接字上发出发送和接收问题,则还需要同步,因为发送和接收操作使用套接字的请求队列。

 

如果多个线程尝试使用 RIODequeueCompletion 访问同一RIO_CQ,则必须通过关键部分、超薄的读取器编写器锁或类似的互斥机制协调访问。 如果未共享完成队列,则不需要相互排除。

当不再需要完成队列时,应用程序可以使用 RIOCloseCompletionQueue 函数将其关闭。

RIO_CQ typedef 在 Mswsockdef.h 头文件中定义,该文件自动包含在 Mswsock.h 头文件中。 不应直接使用 Mswsockdef.h 头文件。

线程安全性

如果多个线程尝试使用 RIODequeueCompletion 访问同一RIO_CQ,则必须通过关键部分、超薄的读取器编写器锁或类似的互斥机制协调访问。 如果未共享完成队列,则不需要相互排除。

要求

要求
最低受支持的客户端
Windows 8 [仅限桌面应用]
最低受支持的服务器
Windows Server 2012 [仅限桌面应用]
标头
Mswsockdef.h (包括 Mswsock.h)

另请参阅

CreateIoCompletionPort

CreateEvent

GetQueuedCompletionStatus

GetQueuedCompletionStatusExus

重叠

RIO_NOTIFICATION_COMPLETION

RIO_NOTIFICATION_COMPLETION_TYPE

RIO_RQ

RIOCloseCompletionQueue

RIOCreateCompletionQueue

RIOCreateRequestQueue

RIODequeueCompletion

RIONotify

WSACreateEvent

WSAResetEvent

WSAWaitForMultipleEvents