I/O 完成端口可以理解為高性能、高可伸縮性的超級消息隊列。若有一個事件驅動的系統,采用完成端口能很達到很高的性能。而且使用起來就會非常簡單。
1。 使用 CreateIoCompletionPort API 來創建完成端口。它用于關聯內核對象與完成端口的
API。在文件句柄或套接字句柄與完成端口相關聯后,在該句柄上完成的所有 I/O 請求將排隊
到完成端口隊列中。
2。可以采用通知方式排列到完成端口隊列中,使用 PostQueuedCompletionStatus API
將自定義的通知排列到完成端口隊列中。
將可以用于向線程發出信號通知事件或插入任何其他自定義外部事件。如,
HRESULT StopThreads()
{
for (int i = 0; i <
THREAD_COUNT; i++)
{
PostQueuedCompletionStatus(g_IOPort, 0, 0, NULL);}
//等待所有線程
WaitForMultipleObjects(THREAD_COUNT,
g_Threads, TRUE, INFINITE);
for (int i = 0; i < THREAD_COUNT;
i++)
{
CloseHandle(g_Threads[i]);
g_Threads[i] = NULL;
}
return S_OK;
}
}
而在處理GetQueuedCompletionStatus部分,則收到overlapped = null,
numberOfBytes = 0,key =0,則可以相應作出處理。比如該例中的關閉線程。
UINT __stdcall CompletionThread(PVOID param)
{
BOOL result =
FALSE;
OverlappedBase* overlapped =
NULL;
ULONG_PTR
key = 0;
DWORD numberOfBytes =
0;
for (;;)
{
result =
GetQueuedCompletionStatus(g_IOPort,
&numberOfBytes,
&key,
(OVERLAPPED**)&overlapped,
INFINITE);
if
(result)
{
if (numberOfBytes ==
0 && key == 0 &&
!overlapped)
break;
....
}
}
return 0;
}