Поделиться через


RIO_CQ

RIO_CQ typedef указывает дескриптор очереди завершения, используемый для уведомления о завершении ввода-вывода путем отправки и получения запросов с помощью зарегистрированных расширений ввода-вывода Winsock.

typedef struct RIO_CQ_t* RIO_CQ, **PRIO_CQ;

RIO_CQ

Тип данных, указывающий дескриптор очереди завершения, используемый для уведомления о завершении ввода-вывода путем отправки и получения запросов.

Комментарии

Объект RIO_CQ используется для уведомления о завершении ввода-вывода от зарегистрированных расширений ввода-вывода Winsock о отправке и получении сетевых запросов.

Приложение может использовать функцию RIONotify для запроса уведомления, если очередь завершения RIO_CQ не пуста. Приложение также может опрашивание состояния в любое время очереди завершения RIO_CQ неблокирующим способом с помощью функции RIODequeueCompletion .

Объект RIO_CQ создается с помощью функции RIOCreateCompletionQueue . Во время создания приложение должно указать размер очереди, который определяет, сколько записей завершения оно может хранить. Когда приложение вызывает функцию RIOCreateRequestQueue для получения дескриптора RIO_RQ , приложение должно указать дескриптор RIO_CQ для завершения отправки и дескриптор RIO_CQ для завершения получения. Эти дескрипторы могут быть идентичными, если для завершения отправки и получения следует использовать одну очередь. Для функции RIOCreateRequestQueue также требуется максимальное количество незавершенных операций отправки и получения, которые оплачиваются за счет емкости связанной очереди завершения или очередей. Если очереди не имеют достаточной емкости, вызов RIOCreateRequestQueue завершится ошибкойWSAENOBUFS.

Поведение уведомлений для очереди завершения задается при создании RIO_CQ .

Для очереди завершения, которая использует событие, для элемента Typeструктуры RIO_NOTIFICATION_COMPLETION задано значение RIO_EVENT_COMPLETION. Элемент Event.EventHandle должен содержать дескриптор события, созданного функцией WSACreateEvent или CreateEvent . Чтобы получить завершение RIONotify , приложение должно ожидать указанного дескриптора события с помощью WSAWaitForMultipleEvents или аналогичной подпрограммы ожидания. Если приложение планирует сбросить и повторно использовать событие, приложение может уменьшить затраты, задав для элемента Event.NotifyReset значение, отличное от нуля. Это приводит к автоматическому сбросу события функцией RIONotify при появлении уведомления. Это устраняет необходимость вызова функции WSAResetEvent для сброса события между вызовами функции RIONotify .

Для очереди завершения, которая использует порт завершения ввода-вывода, элемент Typeструктуры RIO_NOTIFICATION_COMPLETION имеет значение RIO_IOCP_COMPLETION. Элемент Iocp.IocpHandle должен содержать дескриптор для порта завершения ввода-вывода, созданного функцией CreateIoCompletionPort . Чтобы получить завершение RIONotify , приложение должно вызвать функцию GetQueuedCompletionStatus или GetQueuedCompletionStatusEx . Приложение должно предоставить выделенный объект OVERLAPPED для очереди завершения. Кроме того, оно может использовать элемент Iocp.CompletionKey , чтобы отличать запросы RIONotify в очереди завершения от других завершений ввода-вывода, включая завершения RIONotify для других очередей завершения.

Примечание

В целях повышения эффективности доступ к очередям завершения (RIO_CQ структуры) и очередям запросов (RIO_RQ структуры) не защищен примитивами синхронизации. Если вам нужно получить доступ к очереди завершения или запроса из нескольких потоков, доступ должен координироваться критически важным разделом, тонкой блокировкой записи считывания или аналогичным механизмом. Эта блокировка не требуется для доступа одного потока. Различные потоки могут получать доступ к отдельным очередям запросов и завершения без блокировок. Синхронизация возникает только в том случае, если несколько потоков пытаются получить доступ к одной очереди. Синхронизация также требуется, если несколько потоков отправляют и получают в одном сокете, так как операции отправки и получения используют очередь запросов сокета.

 

Если несколько потоков пытаются получить доступ к одному и тому же RIO_CQ с помощью RIODequeueCompletion, доступ должен координироваться критически важным разделом, тонкой блокировкой модуля чтения или аналогичным механизмом взаимного исключения. Если очереди завершения не являются общими, взаимное исключение не требуется.

Если очередь завершения больше не нужна, приложение может закрыть ее с помощью функции RIOCloseCompletionQueue .

Определение RIO_CQ typedef определяется в файле заголовка Mswsockdef.h, который автоматически включается в файл заголовка Mswsock.h. Файл заголовка Mswsockdef.h никогда не следует использовать напрямую.

Потокобезопасность

Если несколько потоков пытаются получить доступ к одному и тому же RIO_CQ с помощью RIODequeueCompletion, доступ должен координироваться критически важным разделом, тонкой блокировкой модуля чтения или аналогичным механизмом взаимного исключения. Если очереди завершения не являются общими, взаимное исключение не требуется.

Требования

Требование Значение
Минимальная версия клиента
Windows 8 [только классические приложения]
Минимальная версия сервера
Windows Server 2012 [только классические приложения]
Заголовок
Mswsockdef.h (включая Mswsock.h)

См. также раздел

CreateIoCompletionPort

CreateEvent

GetQueuedCompletionStatus

GetQueuedCompletionStatusEx

ПЕРЕКРЫВАЮЩИХСЯ

RIO_NOTIFICATION_COMPLETION

RIO_NOTIFICATION_COMPLETION_TYPE

RIO_RQ

RIOCloseCompletionQueue

RIOCreateCompletionQueue

RIOCreateRequestQueue

RIODequeueCompletion

RIONotify

WSACreateEvent

WSAResetEvent

WSAWaitForMultipleEvents