I/O完成端口是在异步I/O中使用较多的一种异步方式
前面使用的三种异步I/O操作都是使用的串行模型来进行的异步I/O操作
而完成端口才是真正使用的并行模型来进行的异步I/O操作
在使用完成端口时会创建
设备的队列
设备操作的对列
线程池
HANDLE WINAPI CreateIoCompletionPort(
_In_ HANDLE FileHandle,//文件句柄
_In_opt_ HANDLE ExistingCompletionPort,//已存在的完成端口
_In_ ULONG_PTR CompletionKey,//完成端口的Key
_In_ DWORD NumberOfConcurrentThreads//创建的线程数,当该参数为0表示允许同时相等数目于处理器个数的线程访问该消息队列
);
当创建的线程数大于CPU的物理线程数时,CPU会进行线程上下文的切换,此时会浪费很大的效率
当完成端口创建好之后需要向里面的对列插入请求
BOOL WINAPI PostQueuedCompletionStatus(
_In_ HANDLE CompletionPort,
_In_ DWORD dwNumberOfBytesTransferred,
_In_ ULONG_PTR dwCompletionKey,
_In_opt_ LPOVERLAPPED lpOverlapped
);
BOOL WINAPI GetQueuedCompletionStatus(
_In_ HANDLE CompletionPort,
_Out_ LPDWORD lpNumberOfBytes,
_Out_ PULONG_PTR lpCompletionKey,
_Out_ LPOVERLAPPED *lpOverlapped,
_In_ DWORD dwMilliseconds
);