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;
}