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 関数には、関連付けられている完了キューまたはキューの容量に対して課金される未処理の送受信操作の最大数も必要です。 キューに十分な容量が残っていない場合、 RIOCreateRequestQueue 呼び出しは WSAENOBUFS で失敗します。
完了キューの通知動作は、 RIO_CQ の作成時に設定されます。
イベントを使用する完了キューの場合、RIO_NOTIFICATION_COMPLETION構造体の Type メンバーは RIO_EVENT_COMPLETION に設定されます。 Event.EventHandle メンバーには、WSACreateEvent または CreateEvent 関数によって作成されたイベントのハンドルが含まれている必要があります。 RIONotify の完了を受け取る場合、アプリケーションは WSAWaitForMultipleEvents または同様の待機ルーチンを使用して、指定されたイベント ハンドルを待機する必要があります。 アプリケーションがイベントのリセットと再利用を計画している場合、 Event.NotifyReset メンバーを 0 以外の値に設定することで、アプリケーションのオーバーヘッドを削減できます。 これにより、通知が発生したときに RIONotify 関数によってイベントが自動的にリセットされます。 これにより、 WSAResetEvent 関数を呼び出して 、RIONotify 関数の呼び出し間でイベントをリセットする必要が軽減されます。
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 構造体) へのアクセスは、同期プリミティブによって保護されません。 複数のスレッドから完了キューまたは要求キューにアクセスする必要がある場合は、クリティカル セクション、スリム リーダー書き込みロック、または同様のメカニズムによってアクセスを調整する必要があります。 このロックは、1 つのスレッドによるアクセスには必要ありません。 異なるスレッドは、ロックなしで個別の要求/完了キューにアクセスできます。 同期の必要性は、複数のスレッドが同じキューにアクセスしようとした場合にのみ発生します。 また、送信操作と受信操作でソケットの要求キューが使用されるため、複数のスレッドの問題が同じソケットで送受信される場合も、同期が必要です。
RIODequeueCompletion を使用して複数のスレッドが同じRIO_CQにアクセスしようとすると、クリティカル セクション、スリム リーダー ライター ロック、または同様の相互除外メカニズムによってアクセスを調整する必要があります。 完了キューが共有されていない場合、相互除外は必要ありません。
完了キューが不要になった場合、アプリケーションは RIOCloseCompletionQueue 関数を使用してキューを閉じることができます。
RIO_CQ typedef は、Mswsockdef.h ヘッダー ファイルに自動的に含まれる Mswsockdef.h ヘッダー ファイルで定義されます。 Mswsockdef.h ヘッダー ファイルを直接使用しないでください。
スレッド セーフ
RIODequeueCompletion を使用して複数のスレッドが同じRIO_CQにアクセスしようとすると、クリティカル セクション、スリム リーダー ライター ロック、または同様の相互除外メカニズムによってアクセスを調整する必要があります。 完了キューが共有されていない場合、相互除外は必要ありません。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント |
Windows 8 [デスクトップ アプリのみ] |
サポートされている最小のサーバー |
Windows Server 2012 [デスクトップ アプリのみ] |
Header |
|
こちらもご覧ください