Freigeben über


RIO_CQ

Der RIO_CQ typdef gibt einen Vervollständigungswarteschlangendeskriptor an, der für E/A-Vervollständigungsbenachrichtigungen verwendet wird, indem Anforderungen mit den registrierten Winsock-E/A-Erweiterungen gesendet und empfangen werden.

typedef struct RIO_CQ_t* RIO_CQ, **PRIO_CQ;

RIO_CQ

Ein Datentyp, der einen Vervollständigungswarteschlangendeskriptor angibt, der für E/A-Vervollständigungsbenachrichtigungen durch Senden und Empfangen von Anforderungen verwendet wird.

Bemerkungen

Das RIO_CQ-Objekt wird für die E/A-Vervollständigungsbenachrichtigung zum Senden und Empfangen von Netzwerkanforderungen durch die winsock-registrierten E/A-Erweiterungen verwendet.

Eine Anwendung kann die RIONotify-Funktion verwenden, um eine Benachrichtigung anzufordern, wenn eine RIO_CQ Abschlusswarteschlange nicht leer ist. Eine Anwendung kann mithilfe der RIODequeueCompletion-Funktion auch jederzeit die status einer RIO_CQ Abschlusswarteschlange auf nicht blockierende Weise abfragen.

Das RIO_CQ-Objekt wird mithilfe der RIOCreateCompletionQueue-Funktion erstellt. Bei der Erstellung muss die Anwendung die Größe der Warteschlange angeben, die bestimmt, wie viele Abschlusseinträge sie enthalten kann. Wenn eine Anwendung die RIOCreateRequestQueue-Funktion aufruft, um ein RIO_RQ-Handle abzurufen, muss die Anwendung ein RIO_CQ-Handle für Sendeabschlüsse und ein RIO_CQ-Handle für Empfangsabschlüsse angeben. Diese Handles können identisch sein, wenn dieselbe Warteschlange für die Vervollständigung von Senden und Empfangen verwendet werden soll. Die RIOCreateRequestQueue-Funktion erfordert auch eine maximale Anzahl ausstehender Sende- und Empfangsvorgänge, die mit der Kapazität der zugeordneten Abschlusswarteschlange oder -warteschlangen belastet werden. Wenn die Warteschlangen nicht über genügend Kapazität verfügen, schlägt der RIOCreateRequestQueue-Aufruf mit WSAENOBUFS fehl.

Das Benachrichtigungsverhalten für eine Vervollständigungswarteschlange wird festgelegt, wenn die RIO_CQ erstellt wird.

Für eine Vervollständigungswarteschlange, die ein Ereignis verwendet, wird das Type-Element der RIO_NOTIFICATION_COMPLETION-Struktur auf RIO_EVENT_COMPLETION festgelegt. Das Event.EventHandle-Element sollte das Handle für ein Ereignis enthalten, das von der WSACreateEvent - oder CreateEvent-Funktion erstellt wurde. Um die RIONotify-Vervollständigung zu erhalten, sollte die Anwendung mithilfe von WSAWaitForMultipleEvents oder einer ähnlichen Warteroutine auf das angegebene Ereignishandle warten. Wenn die Anwendung plant, das Ereignis zurückzusetzen und wiederzuverwenden, kann die Anwendung den Mehraufwand reduzieren, indem das Event.NotifyReset-Element auf einen Wert ungleich 0 festgelegt wird. Dies bewirkt, dass das Ereignis automatisch von der RIONotify-Funktion zurückgesetzt wird, wenn die Benachrichtigung auftritt. Dadurch entfällt die Notwendigkeit, die WSAResetEvent-Funktion aufzurufen, um das Ereignis zwischen Aufrufen der RIONotify-Funktion zurückzusetzen.

Für eine Vervollständigungswarteschlange, die einen E/A-Abschlussport verwendet, wird der Typmember der RIO_NOTIFICATION_COMPLETION-Struktur auf RIO_IOCP_COMPLETION festgelegt. Der Iocp.IocpHandle-Member sollte das Handle für einen E/A-Abschlussport enthalten, der von der CreateIoCompletionPort-Funktion erstellt wurde. Um die RIONotify-Vervollständigung zu erhalten, sollte die Anwendung die Funktion GetQueuedCompletionStatus OderGetQueuedCompletionStatusEx aufrufen. Die Anwendung sollte ein dediziertes OVERLAPPED-Objekt für die Abschlusswarteschlange bereitstellen, und sie kann auch das Iocp.CompletionKey-Element verwenden, um RIONotify-Anforderungen in der Abschlusswarteschlange von anderen E/A-Vervollständigungen zu unterscheiden, einschließlich RIONotify-Vervollständigungen für andere Abschlusswarteschlangen.

Hinweis

Aus Effizienzgründen werden der Zugriff auf die Abschlusswarteschlangen (RIO_CQ Strukturen) und Anforderungswarteschlangen (RIO_RQ Strukturen) nicht durch Synchronisierungsgrundtypen geschützt. Wenn Sie über mehrere Threads auf eine Vervollständigungs- oder Anforderungswarteschlange zugreifen müssen, sollte der Zugriff durch einen kritischen Abschnitt, eine schlanke Lesesperre oder einen ähnlichen Mechanismus koordiniert werden. Diese Sperre ist für den Zugriff durch einen einzelnen Thread nicht erforderlich. Verschiedene Threads können ohne Sperren auf separate Anforderungs-/Vervollständigungswarteschlangen zugreifen. Die Notwendigkeit einer Synchronisierung tritt nur auf, wenn mehrere Threads versuchen, auf dieselbe Warteschlange zuzugreifen. Eine Synchronisierung ist auch erforderlich, wenn mehrere Threads senden und empfangen, die auf demselben Socket gesendet und empfangen werden, da die Sende- und Empfangsvorgänge die Anforderungswarteschlange des Sockets verwenden.

 

Wenn mehrere Threads versuchen, mithilfe von RIODequeueCompletion auf dieselbe RIO_CQ zuzugreifen, muss der Zugriff von einem kritischen Abschnitt, einer schlanken Reader-Writer-Sperre oder einem ähnlichen Mechanismus für gegenseitigen Ausschluss koordiniert werden. Wenn die Abschlusswarteschlangen nicht freigegeben werden, ist kein gegenseitiger Ausschluss erforderlich.

Wenn eine Abschlusswarteschlange nicht mehr benötigt wird, kann eine Anwendung sie mit der RIOCloseCompletionQueue-Funktion schließen.

Die RIO_CQ typedef wird in der Headerdatei Mswsockdef.h definiert, die automatisch in der Headerdatei Mswsock.h enthalten ist. Die Headerdatei "Mswsockdef.h " sollte niemals direkt verwendet werden.

Threadsicherheit

Wenn mehrere Threads versuchen, mithilfe von RIODequeueCompletion auf dieselbe RIO_CQ zuzugreifen, muss der Zugriff von einem kritischen Abschnitt, einer schlanken Reader-Writer-Sperre oder einem ähnlichen Mechanismus für gegenseitigen Ausschluss koordiniert werden. Wenn die Abschlusswarteschlangen nicht freigegeben werden, ist kein gegenseitiger Ausschluss erforderlich.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client)
Windows 8 [nur Desktop-Apps]
Unterstützte Mindestversion (Server)
Windows Server 2012 [nur Desktop-Apps]
Header
Mswsockdef.h (mswsock.h einschließen)

Siehe auch

CreateIoCompletionPort

CreateEvent

GetQueuedCompletionStatus

GetQueuedCompletionStatusEx

ÜBERLAPPENDE

RIO_NOTIFICATION_COMPLETION

RIO_NOTIFICATION_COMPLETION_TYPE

RIO_RQ

RIOCloseCompletionQueue

RIOCreateCompletionQueue

RIOCreateRequestQueue

RIODequeueCompletion

RIONotify

WSACreateEvent

WSAResetEvent

WSAWaitForMultipleEvents