Condividi tramite


RIO_CQ

Il typedef RIO_CQ specifica un descrittore della coda di completamento usato per la notifica di completamento di I/O inviando e ricevere richieste con le estensioni di I/O registrate da Winsock.

typedef struct RIO_CQ_t* RIO_CQ, **PRIO_CQ;

RIO_CQ

Tipo di dati che specifica un descrittore della coda di completamento utilizzato per la notifica di completamento di I/O tramite l'invio e la ricezione delle richieste.

Commenti

L'oggetto RIO_CQ viene usato per la notifica di completamento di I/O di invio e ricezione delle richieste di rete dalle estensioni di I/O registrate da Winsock.

Un'applicazione può usare la funzione RIONotify per richiedere la notifica quando una coda di completamento RIO_CQ non è vuota. Un'applicazione può anche eseguire il polling dello stato in qualsiasi momento di una coda di completamento RIO_CQ in modo non bloccante usando la funzione RIODequeueCompletion .

L'oggetto RIO_CQ viene creato usando la funzione RIOCreateCompletionQueue. Al momento della creazione, l'applicazione deve specificare le dimensioni della coda, che determina il numero di voci di completamento che può contenere. Quando un'applicazione chiama la funzione RIOCreateRequestQueue per ottenere un handle RIO_RQ , l'applicazione deve specificare un handle di RIO_CQ per i completamenti di invio e un handle RIO_CQ per ricevere i completamenti. Questi handle possono essere identici quando deve essere usata la stessa coda per l'invio e la ricezione del completamento. La funzione RIOCreateRequestQueue richiede anche un numero massimo di operazioni di invio e ricezione in sospeso, che vengono addebitate in base alla capacità della coda o delle code di completamento associate. Se le code non dispongono di capacità sufficiente, la chiamata RIOCreateRequestQueue avrà esito negativo con WSAENOBUFS.

Il comportamento di notifica per una coda di completamento viene impostato quando viene creato il RIO_CQ .

Per una coda di completamento che usa un evento, il membro Type della struttura RIO_NOTIFICATION_COMPLETION è impostato su RIO_EVENT_COMPLETION. Il membro Event.EventHandle deve contenere l'handle per un evento creato dalla funzione WSACreateEvent o CreateEvent . Per ricevere il completamento di RIONotify , l'applicazione deve attendere l'handle di evento specificato usando WSAWaitForMultipleEvents o una routine di attesa simile. Se l'applicazione prevede di reimpostare e riutilizzare l'evento, l'applicazione può ridurre il sovraccarico impostando il membro Event.NotifyReset su un valore diverso da zero. Ciò fa sì che l'evento venga reimpostato automaticamente dalla funzione RIONotify quando si verifica la notifica. Ciò riduce la necessità di chiamare la funzione WSAResetEvent per reimpostare l'evento tra le chiamate alla funzione RIONotify .

Per una coda di completamento che usa una porta di completamento di I/O, il membro Type della struttura RIO_NOTIFICATION_COMPLETION è impostato su RIO_IOCP_COMPLETION. Il membro Iocp.IocpHandle deve contenere l'handle per una porta di completamento I/O creata dalla funzione CreateIoCompletionPort . Per ricevere il completamento rioNotify , l'applicazione deve chiamare la funzione GetQueuedCompletionStatus o GetQueuedCompletionStatusEx . L'applicazione deve fornire un oggetto OVERLAPPED dedicato per la coda di completamento e può anche usare il membro Iocp.CompletionKey per distinguere le richieste RIONotify sulla coda di completamento da altri completamenti di I/O, inclusi i completamenti RIONotify per altre code di completamento.

Nota

Ai fini dell'efficienza, l'accesso alle code di completamento (RIO_CQ struct) e alle code delle richieste (RIO_RQ struct) non sono protette dalle primitive di sincronizzazione. Se è necessario accedere a una coda di completamento o richiesta da più thread, l'accesso deve essere coordinato da una sezione critica, un blocco di scrittura di lettura sottile o un meccanismo simile. Questo blocco non è necessario per l'accesso da un singolo thread. I thread diversi possono accedere a code di completamento/richieste separate senza blocchi. La necessità di sincronizzazione si verifica solo quando più thread tentano di accedere alla stessa coda. La sincronizzazione è necessaria anche se più thread invia e riceve sullo stesso socket perché le operazioni di invio e ricezione usano la coda di richieste del socket.

 

Se più thread tentano di accedere alla stessa RIO_CQ usando RIODequeueCompletion, l'accesso deve essere coordinato da una sezione critica, da un blocco del writer lettore sottile o da un meccanismo di esclusione reciproca simile. Se le code di completamento non sono condivise, l'esclusione reciproca non è necessaria.

Quando una coda di completamento non è più necessaria, un'applicazione può chiuderla usando la funzione RIOCloseCompletionQueue .

Il typedef RIO_CQ viene definito nel file di intestazione Mswsockdef.h , incluso automaticamente nel file di intestazione Mswsock.h . Il file di intestazione Mswsockdef.h non deve mai essere usato direttamente.

Thread safety

Se più thread tentano di accedere alla stessa RIO_CQ usando RIODequeueCompletion, l'accesso deve essere coordinato da una sezione critica, da un blocco del writer lettore sottile o da un meccanismo di esclusione reciproca simile. Se le code di completamento non sono condivise, l'esclusione reciproca non è necessaria.

Requisiti

Requisito Valore
Client minimo supportato
Windows 8 [solo app desktop]
Server minimo supportato
Windows Server 2012 [solo app desktop]
Intestazione
Mswsockdef.h (include Mswsock.h)

Vedi anche

CreateIoCompletionPort

CreateEvent

GetQueuedCompletionStatus

GetQueuedCompletionStatusEx

SOVRAPPOSTA

RIO_NOTIFICATION_COMPLETION

RIO_NOTIFICATION_COMPLETION_TYPE

RIO_RQ

RIOCloseCompletionQueue

RIOCreateCompletionQueue

RIOCreateRequestQueue

RIODequeueCompletion

RIONotify

WSACreateEvent

WSAResetEvent

WSAWaitForMultipleEvents