异步I/O(4)完成端口

  1. 使用设备内核对象使用设备内核对象
  2. 使用事件内核对象 使用事件内核对象
  3. 可提醒I/O 可提醒I/O
  4. I/O完成端口

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

你可能感兴趣的:(windows编程)