I/O 完成端口可以理解為高性能、高可伸縮性的超級(jí)消息隊(duì)列。若有一個(gè)事件驅(qū)動(dòng)的系統(tǒng),采用完成端口能很達(dá)到很高的性能。而且使用起來(lái)就會(huì)非常簡(jiǎn)單。
1。 使用 CreateIoCompletionPort API 來(lái)創(chuàng)建完成端口。它用于關(guān)聯(lián)內(nèi)核對(duì)象與完成端口的
API。在文件句柄或套接字句柄與完成端口相關(guān)聯(lián)后,在該句柄上完成的所有 I/O 請(qǐng)求將排隊(duì)
到完成端口隊(duì)列中。
2。可以采用通知方式排列到完成端口隊(duì)列中,使用 PostQueuedCompletionStatus API
將自定義的通知排列到完成端口隊(duì)列中。
將可以用于向線程發(fā)出信號(hào)通知事件或插入任何其他自定義外部事件。如,
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,則可以相應(yīng)作出處理。比如該例中的關(guān)閉線程。
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;
}