异步函数同步结束时是否设置了OVERLAPPED.hEvent?

时间:2013-08-21 12:23:57

标签: multithreading winapi winsock

MSDN说AcceptEx()可能会返回TRUE,但我永远无法重现这一点。

如果AcceptEx()返回TRUE,是否会设置hEvent? 在AcceptEx()返回TRUE后调用GetOverlappedResult()是否安全?

对于像ReadFile()这样的其他函数是否相同?

2 个答案:

答案 0 :(得分:1)

至少对于ReadFile(socket)来说,就像那样:
如果ReadFile()成功或失败并且ERROR_IO_PENDING,则设置事件 如果在调用ReadFile()之前关闭连接,则会失败,并且未设置事件。

答案 1 :(得分:0)

AcceptExOVERLAPPED结构上的MSDN页面可以看出,当AcceptEx完成时,应将OVERLAPPED::hEvent句柄设置为发信号。

来自MSDN page of OVERLAPPED

  

当操作完成时,系统将设置为信号状态的事件句柄。用户必须使用CreateEvent函数将此成员初始化为零或有效事件句柄在将此结构传递给任何重叠函数之前。

它在这里的讨论相当广泛,我认为可以肯定它适用于采用OVERLAPPED结构的所有函数。

如果您的AcceptEx永远不会返回true,则可能是您的代码中存在错误。除非您发布实际代码,否则很难说明可能是什么。

OVERLAPPED的同一页面中,它说明了ReadFile

  

ReadFile和WriteFile等函数在开始I / O操作之前将此句柄设置为非信号状态。 操作完成后,手柄将设置为信号状态。

关于致电GetOverlappedResult,它还具体说明了该做什么:

  

GetOverlappedResult等功能和同步等待功能将自动重置事件重置为非信号状态。因此,您应该使用手动重置事件; 如果您使用自动重置事件,则等待操作完成后应用程序可以停止响应,然后在bWait参数设置为TRUE的情况下调用GetOverlappedResult。

就像@HansPassant在评论中所说,不要使用它。