Здравствуйте, acDev, Вы писали:
R>>Это минимальный репродьюсер проблемы из большой программы.
R>>И, да, ошибка не в этом. Я видел, что потоки висят в WSAGetOverlappedResult.
D>По логике вызов CancelIoEx должен происходить только тогда, когда поле Internal структуры OVERLAPPED содержит 997 (WSA_IO_PENDING). D>В вашем же когда это условие не выполняется.
Тогда я не понимаю, как потенциально CancelIoEx может отменять операции в других потоках -- основное назначение функции. Если IO происходит в одном потоке, а CancelIoEx — в другом, то завершение IO и CancelIoEx по определению происходят одновременно. Следовательно состояние OVERLAPPED может меняться из PENDING в "завершено".
Мое понимание, что CancelIoEx можно звать даже для уже завершенной оперции. В этом случае она возращает документированный код возврата ERROR_NOT_FOUND.
Если это не так, то как тогда вообще использовать CancelIoEx?