3

当使用异步 I/O(或 Win32 术语中的“重叠”I/O)时,我们需要处理OVERLAPPED结构及其hEvent成员。如果 I/O 函数会延迟读取或写入操作,我们会得到一个ERROR_IO_PENDING错误代码,然后我们将等待异步操作完成一个WaitForXxxEvent函数,然后我们将调用GetOverlappedResult.

但是,如果 I/O 操作立即完成,我们将不会得到ERROR_IO_PENDING,并且在读取操作中,我们的读取缓冲区将立即被填满。但是OVERLAPPED::hEvent会员呢?它会被设置为信号状态吗?我还没有找到关于这一点的明确声明。

这个问题似乎毫无意义(如果我知道操作已经完成,为什么要处理该事件?),但是我有一个模仿重叠模式的库,我需要具有相同的确切行为。


正如edgar.holleis他的评论中指出的那样,Raymond Chen在他的博客中解释了这一点:http: //blogs.msdn.com/b/oldnewthing/archive/2014/02/06/10497096.aspx

如果异步 I/O 同步完成,是否会发出 OVERLAPPED 结构中的 hEvent 信号?

是的。

当 I/O 完成时(无论是同步还是异步),都会发出事件信号并且完成状态通知会排队。该 Get­Overlapped­Result/Ex函数可用于等待已经完成的 I/O;它只会立即返回。如果你问 HasOverlappedIoCompleted I/O 是否完成,并且 I/O 同步完成,它会正确报告,“是的,当然完成了。哎呀,很久以前完成了!”

换句话说,您可以在逻辑上将异步 I/O 请求同步完成的情况视为异步完成。它只是在你眨眼之前异步完成。

4

1 回答 1

2

不,不会的。我花了很长时间才弄清楚这一点;)

于 2010-03-24T22:07:15.013 回答