Что делать, если CancelIo не удается? - PullRequest
2 голосов
/ 16 октября 2010

Есть ряд причин для вызова CancelIo, но в моем конкретном случае я звоню ему, чтобы узнать, что система больше не записывает в буфер.Как только я это знаю, я могу безопасно освободить буфер.

Но что, если CancelIo завершится неудачно?То, что я делаю сейчас, это явно утечка буфера и выдача исключения.Есть ли лучшие способы справиться с этим?

PS Аналогичные звонки для Европы, Ганимеда и Каллисто, кажется, отсутствуют.Должен ли я сообщить об ошибке?

Ответы [ 4 ]

0 голосов
/ 21 сентября 2014

Возможно, мой ответ не связан с вашим вопросом.но может помочь ..

В асинхронном IO..CancelIoEx отменить ожидающий IO.Если имеется ожидающий ввод-вывод, он возвращает 1 и генерирует сообщение о завершении или код завершения вызова.Если ожидающий ввод-вывод отсутствует, он возвращает 0 с кодом ошибки 1168..нет сообщение о завершении и код завершения вызова отсутствует.Но на самом деле.может прибыть запланированный ввод-вывод сразу после того, как звонит cancellioex.Это все корень зла.Я думал, отменил все IO.но все еще остается IO ..

0 голосов
/ 18 октября 2010

Вы не должны немедленно удалять свои буферы после отправки запроса на отмену.

Взято из документации CancelIoEx :

Если есть ожидающие IВыполняются операции / O для указанного дескриптора файла, функция CancelIoEx помечает их для отмены.Большинство видов операций могут быть отменены немедленно;другие операции могут продолжаться до завершения, прежде чем они будут фактически отменены, и вызывающий абонент уведомляется.Функция CancelIoEx не ожидает завершения всех отмененных операций.

Так что CancelIo не «освобождает» операцию io, а помечает ее только как «отмененную».Вам нужно подождать, пока закончится асинхронное чтение / запись (успешно или с ERROR_OPERATION_ABORTED.

).
0 голосов
/ 06 декабря 2010

Не думаю, что здесь есть ответ, более удовлетворяющий, чем тот, который я уже нашел:

Утечка из буфера (и выдача исключения (или выполнение эквивалента для вашей среды)).

0 голосов
/ 16 октября 2010

В документах MSDN не очень ясно, какие ошибки могут быть возвращены. Я полагаю (поскольку CancelIo в любом случае асинхронный), это означает, что вы использовали плохой дескриптор или что-то подобное. Под асинхронным я подразумеваю, что только из-за того, что CancelIo возвращает OK, вы не можете немедленно освободить буфер для любого ожидающего ввода-вывода.

В указано , что ожидающие операции ввода / вывода будут возвращены с ERROR_OPERATION_ABORTED. Я думаю, что вы уже отслеживаете состояние ожидающего ввода-вывода, так что вы можете безопасно освободить буфер, если и только если все ожидающие ввода-вывода вернут эту ошибку. Если ожидающий ввод-вывод останется зависшим после CancelIo, освобождение буфера может вызвать каскад нежелательных побочных эффектов.

...