当使用asynchronousI / O(或Win32行话中的“重叠”I / O)时,我们需要处理OVERLAPPED
结构和他的hEvent
成员。 如果I / O函数会延迟读取或写入操作,我们将得到一个ERROR_IO_PENDING
错误代码,然后我们将等待asynchronous操作完成一个WaitForXxxEvent
函数,然后调用GetOverlappedResult
。
但是,如果I / O操作立即完成,我们将不会获得ERROR_IO_PENDING
,并且在读取操作中,我们的读取缓冲区将立即被填充。 但是OVERLAPPED::hEvent
成员呢? 它会被设置为信号状态? 我还没有find明确的说法。
这个问题似乎毫无意义(为什么处理事件,如果我知道该操作已经完成?),但是我有一个模仿重叠模式库,我需要有相同的确切行为。
正如edgar.holleis在他的评论中所指出的, Raymond Chen在他的博客中解释了这一点: http : //blogs.msdn.com/b/oldnewthing/archive/2014/02/06/10497096.aspx
如果一个asynchronousI / O同步完成,那么OVERLAPPED结构中的hEvent是否仍然有信号?
是。
当I / O完成时(无论是同步的还是asynchronous的),事件被发信号并且完成状态通知被排队。
GetOverlappedResult/Ex
函数可用于等待已完成的I / O; 它只会立即返回。 如果你询问HasOverlappedIoCompleted I / O是否已经完成,并且I / O同步完成,它会正确地报告“是的,当然它已经完成了,哎呀,很久以前就完成了!换句话说,您可以在逻辑上将asynchronousI / O请求的情况同步完成,就像它asynchronous完成一样。 它只是在你眨眼之前asynchronous完成。
不,不会的。 花了我好几年的时间才明白这一点:)