Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 异步函数同步结束时是否设置了OVERLAPPED.hEvent?_Multithreading_Winapi_Winsock - Fatal编程技术网

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

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

MSDN说AcceptEx()可能返回TRUE,但我始终无法复制它

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


像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()/<代码>。这不太难测试。然而,我现在很困惑:-)