Multithreading 异步函数同步结束时是否设置了OVERLAPPED.hEvent?
MSDN说AcceptEx()可能返回TRUE,但我始终无法复制它 如果AcceptEx()返回TRUE,是否将设置hEvent? 在AcceptEx()返回TRUE后调用GetOverlappedResult()安全吗Multithreading 异步函数同步结束时是否设置了OVERLAPPED.hEvent?,multithreading,winapi,winsock,Multithreading,Winapi,Winsock,MSDN说AcceptEx()可能返回TRUE,但我始终无法复制它 如果AcceptEx()返回TRUE,是否将设置hEvent? 在AcceptEx()返回TRUE后调用GetOverlappedResult()安全吗 像ReadFile()这样的其他函数也一样吗?从AcceptEx上的MSDN页面和OVERLAPPED结构可以看出,当AcceptEx完成时,应该将OVERLAPPED::hEvent句柄设置为signaled 从 操作完成后,系统将事件的句柄设置为信号状态。用户必须使用Cre
像ReadFile()这样的其他函数也一样吗?从
AcceptEx
上的MSDN页面和OVERLAPPED
结构可以看出,当AcceptEx
完成时,应该将OVERLAPPED::hEvent
句柄设置为signaled
从
操作完成后,系统将事件的句柄设置为信号状态。用户必须使用CreateEvent函数将此成员初始化为零或有效的事件句柄,然后才能将此结构传递给任何重叠的函数
这里讨论的范围相当广泛,我可以说,假设它适用于采用重叠
结构的所有函数是安全的
如果您的AcceptEx
从未返回true,则可能是您的代码中存在错误。除非您发布实际的代码,否则很难说这可能是什么
在OVERLAPPED
的同一页中,它谈到了ReadFile
ReadFile和WriteFile等函数在开始I/O操作之前将此句柄设置为未签名状态当操作完成时,手柄被设置为信号状态。
关于调用GetOverlappedResult
,它还特别说明了要执行的操作:
诸如GetOverlappedResult
等功能和同步等待功能将自动重置事件重置为非信号状态。因此,应使用手动重置事件如果使用自动重置事件,则如果等待操作完成,然后调用GetOverlappedResult并将bWait参数设置为TRUE,则应用程序可以停止响应。
就像@HansPassant在评论中说的,不要使用它。至少对于ReadFile(socket)来说是这样的:如果ReadFile()成功或失败并出现错误\u IO\u挂起,则会设置该事件。
如果在调用ReadFile()之前关闭了连接,则连接将失败,并且未设置事件 这在技术上适用于所有重叠的I/O操作。AcceptEx()不太可能,而且很难测试。很可能是Readfile()。不,不要使用GetOverlappedResult(),它已在未使用重叠操作的情况下完成。如何使用ReadFile重新生成它?即使没有FILE_FLAG_overlapped,ReadFile也会更新重叠结构并设置事件。我认为在任何情况下调用GetOverlappedResult()都是安全的。微软添加这个函数是为了帮助忽略Q+A站点建议的程序员。如果已经有一个连接等待被接受,并且您没有传递接收缓冲区,
AcceptEx
将返回TRUE
。考虑<代码>积压< /COD>参数<代码> ListNe()/<代码>。这不太难测试。然而,我现在很困惑:-)