2016-12-27 3 views
1

getaddrinfo() - функция блокировки.Отменить вызов getaddrinfo()

Как я могу прервать вызов getaddrinfo()?

Например, при закрытии приложения я хочу прервать существующие вызовы этой функции.

ответ

0

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

Если вызов функции предоставляет вам возможность прервать или установить тайм-аут, то вы можете, но этого не делать, и не выполнять большинство вызовов функций.

Но вы можете выполнять эти проверки в отдельном потоке, и теперь вы можете выдать прерывание потоку, выполняющему эти поисковые запросы.

Примечание. Выполнение поиска в потоке и прерывание его не гарантирует немедленного завершения вызова и не означает, что поток немедленно завершится.

Это особенно относится к случаям, когда вызов плохо работает или работает неправильно.

+1

В частности, вы можете использовать CancelSynchronousIo, чтобы попытаться отменить любую операцию ввода-вывода в указанном потоке. Особенно важно, чтобы вы не использовали TerminateThread, см., Например, https://blogs.msdn.microsoft.com/oldnewthing/20150814-00/?p=91811 –

0

getaddrinfo() - функция блокировки, которую вы не можете прервать.

В Windows 8 и более поздних версиях вместо этого вы можете использовать GetAddrInfoEx(). Версия Unicode (GetAddrInfoExW()) поддерживает тайм-аут, предоставляемый вызывающим абонентом, а также Overlapped I/O, или он может вернуть HANDLE для асинхронной задачи, которая затем может быть передана в GetAddrInfoExCancel().

+0

Насколько я вижу, GetAddrInfoExCancel() подчиняется гонке когда вы случайно можете отменить неправильную операцию. (Операция завершается коротким до вызова отмены и номер дескриптора повторно используется другой операцией) –

Смежные вопросы