异步机制

1 前面说到 GetOverlappedResult的bWait含义

GetOverlappedResult的bWait含义表示是否需要等待,如果IO还处于PENDING状态,内部大概实现是这样

  hObject = lpOverlapped->hEvent ? lpOverlapped->hEvent : hFile;
  WaitStatus = WaitForSingleObject(hObject, INFINITE);

为啥OVERLAPPED里面要有hEvent 这个字段,干嘛用的?假设这样的场景,打开一个文件句柄,发起多次异步的读请求,那请求完成如何知道是对应哪次读请求?通过hFile来区分显然不行了,这种情况下,需要为每次IO请求来分配一个事件,当一次IO完成时,这个事件会设置成受信状态。因为WaitForMultipleObjectsEx最多只能传递64个句柄,所以这种方式同时能处理的请求只限制在64个

原文地址:https://www.cnblogs.com/sysnap/p/4414630.html