IOCP: Если операция немедленно возобновляется с ошибкой, могу ли я получить уведомление о завершении?

Если FILE_SKIP_COMPLETION_PORT_ON_SUCCESS не включается, даже если операция завершается немедленно с успехом, я все равно получаю уведомление о завершении на порт завершения. Я хотел бы знать, если это так, если он сразу же завершается с ошибками.

Я обрабатываю дополнения с помощью обработчиков, которые хранятся как std :: function в расширенной структуре OVERLAPPED и выполняются пулом потоков, который зацикливается на порте завершения. Отключение FILE_SKIP_COMPLETION_PORT_ON_SUCCESS означает, что мне не нужно беспокоиться о обработчиках, образующих рекурсивную цепочку, и, в худшем случае, об исчерпании стекового пространства, если операции часто завершаются немедленно. С включенным пропуском обработчик для новой операции должен был бы быть вызван немедленно, если операция сразу возвращается.

Проблема заключается в том, что обработчики должны выполняться как при успехе, так и при ошибке. Однако я не знаю, будет ли перекрывающийся Read / Write / WSARecv / WSASend, возвращающийся немедленно с ошибкой, все еще ставить в очередь пакет завершения, так что я могу разрешить его обработку в обработчике пулом потоков, как в случай успеха. Это выполнимо? Это относится только к определенным типам ошибок, а не к другим? Обходные?

1

Решение

Эта статья базы знаний говорит, что SUCCESS и ERROR_IO_PENDING приводят к генерированию пакета завершения, а другие результаты — нет.

Смотрите совет 4

2

Другие решения

На основе этот блог от Рэймонда Чена, все завершения будут поставлены в очередь в порт завершения, даже если операция завершается синхронно (успешно или с ошибкой).

1

По вопросам рекламы [email protected]