다음을 통해 공유


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 완료 알림에 사용됩니다.

애플리케이션은 RIONotify 함수를 사용하여 RIO_CQ 완료 큐가 비어 있지 않은 경우 알림을 요청할 수 있습니다. 또한 애플리케이션은 RIODequeueCompletion 함수를 사용하여 비차단 방식으로 RIO_CQ 완료 큐의 언제든지 상태 폴링할 수 있습니다.

RIO_CQ 개체는 RIOCreateCompletionQueue 함수를 사용하여 만들어집니다. 생성 시 애플리케이션은 큐의 크기를 지정해야 하며, 큐에서 보유할 수 있는 완료 항목 수를 결정합니다. 애플리케이션이 RIOCreateRequestQueue 함수를 호출하여 RIO_RQ 핸들을 가져오는 경우 애플리케이션은 송신 완료를 위한 RIO_CQ 핸들과 수신 완료를 위한 RIO_CQ 핸들을 지정해야 합니다. 이러한 핸들은 송신 및 수신 완료에 동일한 큐를 사용해야 하는 경우 동일할 수 있습니다. RIOCreateRequestQueue 함수에는 연결된 완료 큐 또는 큐의 용량에 대해 청구되는 최대 수의 미해결 송신 및 수신 작업도 필요합니다. 큐에 남은 용량이 충분하지 않으면 WSAENOBUFS에서 RIOCreateRequestQueue 호출이 실패합니다.

완료 큐에 대한 알림 동작은 RIO_CQ 만들 때 설정됩니다.

이벤트를 사용하는 완료 큐의 경우 RIO_NOTIFICATION_COMPLETION 구조체의 Type 멤버가 RIO_EVENT_COMPLETION 설정됩니다. Event.EventHandle 멤버에는 WSACreateEvent 또는 CreateEvent 함수에서 만든 이벤트에 대한 핸들이 포함되어야 합니다. RIONotify 완료를 받으려면 애플리케이션이 WSAWaitForMultipleEvents 또는 유사한 대기 루틴을 사용하여 지정된 이벤트 핸들을 대기해야 합니다. 애플리케이션이 이벤트를 다시 설정하고 다시 사용하려는 경우 애플리케이션은 Event.NotifyReset 멤버를 0이 아닌 값으로 설정하여 오버헤드를 줄일 수 있습니다. 이렇게 하면 알림이 발생할 때 RIONotify 함수에 의해 이벤트가 자동으로 다시 설정됩니다. 이렇게 하면 RIONotify 함수 호출 간에 이벤트를 다시 설정하기 위해 WSAResetEvent 함수를 호출할 필요가 없습니다.

I/O 완료 포트를 사용하는 완료 큐의 경우 RIO_NOTIFICATION_COMPLETION 구조체의 Type 멤버가 RIO_IOCP_COMPLETION 설정됩니다. Iocp.IocpHandle 멤버는 CreateIoCompletionPort 함수에서 만든 I/O 완료 포트에 대한 핸들을 포함해야 합니다. RIONotify 완료를 받으려면 애플리케이션에서 GetQueuedCompletionStatus 또는 GetQueuedCompletionStatusEx 함수를 호출해야 합니다. 애플리케이션은 완료 큐에 대한 전용 OVERLAPPED 개체를 제공해야 하며, Iocp.CompletionKey 멤버를 사용하여 완료 큐의 RIONotify 요청을 다른 완료 큐에 대한 RIONotify 완료를 비롯한 다른 I/O 완료와 구분할 수도 있습니다.

참고

효율성을 위해 완료 큐(RIO_CQ 구조체) 및 요청 큐(RIO_RQ 구조체)에 대한 액세스는 동기화 기본 형식으로 보호되지 않습니다. 여러 스레드에서 완료 또는 요청 큐에 액세스해야 하는 경우 중요한 섹션, 슬림 판독기 쓰기 잠금 또는 유사한 메커니즘을 통해 액세스를 조정해야 합니다. 이 잠금은 단일 스레드의 액세스에 필요하지 않습니다. 다른 스레드는 잠금 없이 별도의 요청/완료 큐에 액세스할 수 있습니다. 동기화의 필요성은 여러 스레드가 동일한 큐에 액세스하려고 할 때만 발생합니다. 송신 및 수신 작업이 소켓의 요청 큐를 사용하기 때문에 여러 스레드 문제가 동일한 소켓에서 보내고 받는 경우에도 동기화가 필요합니다.

 

여러 스레드가 RIODequeueCompletion을 사용하여 동일한 RIO_CQ 액세스하려는 경우 중요한 섹션, 슬림 판독기 작성기 잠금 또는 유사한 상호 배제 메커니즘을 통해 액세스를 조정해야 합니다. 완료 큐가 공유되지 않으면 상호 제외가 필요하지 않습니다.

완료 큐가 더 이상 필요하지 않은 경우 애플리케이션은 RIOCloseCompletionQueue 함수를 사용하여 큐를 닫을 수 있습니다.

RIO_CQ typedef는 Mswsock.h 헤더 파일에 자동으로 포함되는 Mswsockdef.h 헤더 파일에 정의됩니다. Mswsockdef.h 헤더 파일은 직접 사용하면 안 됩니다.

스레드 보안

여러 스레드가 RIODequeueCompletion을 사용하여 동일한 RIO_CQ 액세스하려는 경우 중요한 섹션, 슬림 판독기 작성기 잠금 또는 유사한 상호 배제 메커니즘을 통해 액세스를 조정해야 합니다. 완료 큐가 공유되지 않으면 상호 제외가 필요하지 않습니다.

요구 사항

요구 사항
지원되는 최소 클라이언트
Windows 8 [데스크톱 앱만 해당]
지원되는 최소 서버
Windows Server 2012 [데스크톱 앱만 해당]
헤더
Mswsockdef.h(Mswsock.h 포함)

참고 항목

CreateIoCompletionPort

CreateEvent

GetQueuedCompletionStatus

GetQueuedCompletionStatusEx

OVERLAPPED

RIO_NOTIFICATION_COMPLETION

RIO_NOTIFICATION_COMPLETION_TYPE

RIO_RQ

RIOCloseCompletionQueue

RIOCreateCompletionQueue

RIOCreateRequestQueue

RIODequeueCompletion

RIONotify

WSACreateEvent

WSAResetEvent

WSAWaitForMultipleEvents