Win32 IO 完成端口和同步出现的 IO 会发生啥?

Posted

技术标签:

【中文标题】Win32 IO 完成端口和同步出现的 IO 会发生啥?【英文标题】:What happens with Win32 IO Completion Port and synchronous appearing IO?Win32 IO 完成端口和同步出现的 IO 会发生什么? 【发布时间】:2012-03-27 11:41:27 【问题描述】:

根据http://support.microsoft.com/kb/156932,如果满足某些条件,对 ReadFile 的调用可能会出现同步。例如,如果目标文件是 NTFS 压缩的。这篇文章没有说明如果文件句柄与 IOCP 关联会发生什么。

那么当文件句柄与 IOCP 关联时,在这种情况下会发生什么?我是否仍会收到此请求的 IO 完成数据包,还是该请求会完全同步执行?

如果是这样,我必须将整个 ReadFile 调用放在一个工作线程中。最初发出 ReadFile 调用的线程不允许阻塞。我考虑 IOCP 的原因是因为将 ReadFile 调用放入工作线程意味着上下文切换到工作线程,然后在 ReadFile 之后立即阻塞。

【问题讨论】:

【参考方案1】:

任何以ERROR_SUCCESSERROR_IO_PENDING 完成的重叠操作都将生成一个完成数据包。见tip 4 of this knowledge base article。

这假设您尚未使用SetFileCompletionNotificationModes() 在相关句柄上启用FILE_SKIP_COMPLETION_PORT_ON_SUCCESS。如果您启用了FILE_SKIP_COMPLETION_PORT_ON_SUCCESS,那么以ERROR_SUCCESS 完成的操作将不会生成完成数据包,您应该在发出重叠操作的位置进行完成处理。

【讨论】:

以上是关于Win32 IO 完成端口和同步出现的 IO 会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

UDP.6.重叠IO模型:完成例程

IO 完成端口:WSARecv() 是如何工作的?

为啥我的 IOCompetionCallback 从未在我的 IO 完成端口上执行?

UDP.07.完成端口模型

为啥完成端口是win

窗口 HTTP IO 完成端口