1

如果启用 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS,那么即使操作立即成功完成,我仍然会在完成端口上收到完成通知。如果它也立即完成并出现错误,我想知道是否是这种情况。

我使用在扩展的 OVERLAPPED 结构中存储为 std::function 的处理程序处理完成,并由在完成端口上循环的线程池执行。禁用 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 意味着我不必担心处理程序会形成递归链,最坏的情况是,如果操作经常立即完成,则会耗尽堆栈空间。启用跳过后,如果操作立即返回,则必须立即调用新操作的处理程序。

问题是处理程序应该在成功和错误时都执行。但是,我不知道是否重叠的 Read/Write/WSARecv/WSASend 立即返回并出现错误仍会将完成数据包排队,以便我可以允许线程池在处理程序中对其进行处理,如成功案例。这是可行的吗?它是否只适用于某些类型的错误而不适用于其他类型的错误?解决方法?

4

2 回答 2

2

这篇知识库文章说 SUCCESS 和 ERROR_IO_PENDING 会导致生成完成数据包,而其他结果则不会。

见技巧 4

于 2014-08-18T17:14:20.320 回答
1

根据Raymond Chen 的这篇博客,即使操作同步完成(成功或有错误条件),所有完成都将排队到完成端口。

于 2014-08-16T05:06:58.300 回答