如果未启用 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS,那么即使操作立即成功完成,我仍然会在完成端口上收到完成通知。如果它也立即完成并出现错误,我想知道是否是这种情况。
我使用在扩展的 OVERLAPPED 结构中存储为 std::function 的处理程序处理完成,并由在完成端口上循环的线程池执行。禁用 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 意味着我不必担心处理程序会形成递归链,最坏的情况是,如果操作经常立即完成,则会耗尽堆栈空间。启用跳过后,如果操作立即返回,则必须立即调用新操作的处理程序。
问题是处理程序应该在成功和错误时都执行。但是,我不知道是否重叠的 Read/Write/WSARecv/WSASend 立即返回并出现错误仍会将完成数据包排队,以便我可以允许线程池在处理程序中对其进行处理,如成功案例。这是可行的吗?它是否只适用于某些类型的错误而不适用于其他类型的错误?解决方法?