检测CancelIoEx是否同步取消 我将每个异步操作超时添加到基于IOCP的网络中,这样我就可以在C++中有一个类似java的NiO 2使用的接口。我使用支持随机访问删除的优先级超时队列实现了这一点(这样,当操作成功完成时,我可以删除其关联的超时)

检测CancelIoEx是否同步取消 我将每个异步操作超时添加到基于IOCP的网络中,这样我就可以在C++中有一个类似java的NiO 2使用的接口。我使用支持随机访问删除的优先级超时队列实现了这一点(这样,当操作成功完成时,我可以删除其关联的超时),c++,winapi,networking,asynchronous,iocp,C++,Winapi,Networking,Asynchronous,Iocp,我的问题是如何处理超时的发生。现在,我使用与给定超时对应的重叠结构调用CancelIoEx。但是,我刚刚在MSDN上读到: 如果文件句柄与完成端口关联,则I/O 如果发生同步操作,则完成数据包不会排队到端口 已成功取消。对于仍挂起的异步操作, 取消操作将对I/O完成数据包进行排队 我使用了重叠结构,扩展了完成处理程序(每个操作用户提供的std::function包含错误代码和写入/读取的字节),每当完成数据包出列时都会执行这些结构(同样,非常类似于Java的NIO.2API)。如果取消是异步进行

我的问题是如何处理超时的发生。现在,我使用与给定超时对应的重叠结构调用CancelIoEx。但是,我刚刚在MSDN上读到:

如果文件句柄与完成端口关联,则I/O 如果发生同步操作,则完成数据包不会排队到端口 已成功取消。对于仍挂起的异步操作, 取消操作将对I/O完成数据包进行排队


我使用了重叠结构,扩展了完成处理程序(每个操作用户提供的std::function包含错误代码和写入/读取的字节),每当完成数据包出列时都会执行这些结构(同样,非常类似于Java的NIO.2API)。如果取消是异步进行的,那么完成处理程序将照常运行,并将使错误操作中止。但是,如果CancelIoEx成功地立即取消操作,该怎么办?听上去,根据上面的引文,我需要在那一点上执行处理程序,因为我以后不会得到一个完成包。但我如何知道是哪种情况,即完成数据包是否已排队或操作立即取消???与其他异步操作不同,CancelIoEx不会产生区分任务同步和异步完成(在本例中为取消)的错误IO_挂起。或者,我读错了吗,任何重叠操作都被认为是异步的(注意:我没有在成功时设置文件跳过完成端口,但这只适用于成功,而不是错误,并且我假设不会影响取消)

这并不是说
CancelIoEx
是同步还是异步的,这表示I/O本身(例如,
ReadFile
)是同步还是异步的。它描述了同步和异步操作之间的行为差异

如果文件句柄与完成端口关联,则I/O 如果发生同步错误,则完成数据包不会排队到端口 操作已成功取消。用于异步操作 仍然挂起,取消操作将排队等待I/O完成 包

同步操作—没有重叠的结构的操作,或将立即完成的操作—将返回一个错误error\u OPERATION\u ABORTED


异步操作——结构重叠且不能立即完成的操作——将有一个完成通知排队等待
错误操作
中止

这并不是说
CancelIoEx
是同步还是异步的,而是说I/O本身(例如
ReadFile
)是同步还是异步的。它描述了同步和异步操作之间的行为差异

如果文件句柄与完成端口关联,则I/O 如果发生同步错误,则完成数据包不会排队到端口 操作已成功取消。用于异步操作 仍然挂起,取消操作将排队等待I/O完成 包

同步操作—没有重叠的结构的操作,或将立即完成的操作—将返回一个错误error\u OPERATION\u ABORTED


异步操作——结构重叠且不能立即完成的操作——将有一个完成通知排队等待
错误操作
中止

这并不是说
CancelIoEx
是同步还是异步的,而是说I/O本身(例如
ReadFile
)是同步还是异步的。它描述了同步和异步操作之间的行为差异

如果文件句柄与完成端口关联,则I/O 如果发生同步错误,则完成数据包不会排队到端口 操作已成功取消。用于异步操作 仍然挂起,取消操作将排队等待I/O完成 包

同步操作—没有重叠的结构的操作,或将立即完成的操作—将返回一个错误error\u OPERATION\u ABORTED


异步操作——结构重叠且不能立即完成的操作——将有一个完成通知排队等待
错误操作
中止

这并不是说
CancelIoEx
是同步还是异步的,而是说I/O本身(例如
ReadFile
)是同步还是异步的。它描述了同步和异步操作之间的行为差异

如果文件句柄与完成端口关联,则I/O 如果发生同步错误,则完成数据包不会排队到端口 操作已成功取消。用于异步操作 仍然挂起,取消操作将排队等待I/O完成 包

同步操作—没有重叠的结构的操作,或将立即完成的操作—将返回一个错误error\u OPERATION\u ABORTED

异步操作(具有不能立即完成的
重叠
结构的操作)将有一个完成通知,该通知将与
错误_操作_中止

一起排队,假设ReadFile()提供了重叠结构,但立即完成。由于我没有设置文件\u SKIP\u COMPLETION\u PORT\u ON \u SUCCESS,我希望成功时有一个完成数据包,出错时手动存储GetLastError()并发布数据包,以便处理GetQueuedCompletionStatusEx()上循环的工作线程中的任何一种情况。那么,我是否可以假设我将得到op返回的错误操作,或者在完成队列中,并且没有其他需要注意的事情?谢谢你,这的确是一件好事