getaddrinfo() - функция блокировки.Отменить вызов getaddrinfo()
Как я могу прервать вызов getaddrinfo()?
Например, при закрытии приложения я хочу прервать существующие вызовы этой функции.
getaddrinfo() - функция блокировки.Отменить вызов getaddrinfo()
Как я могу прервать вызов getaddrinfo()?
Например, при закрытии приложения я хочу прервать существующие вызовы этой функции.
Вы не можете прервать вызов функции таким образом.
Если вызов функции предоставляет вам возможность прервать или установить тайм-аут, то вы можете, но этого не делать, и не выполнять большинство вызовов функций.
Но вы можете выполнять эти проверки в отдельном потоке, и теперь вы можете выдать прерывание потоку, выполняющему эти поисковые запросы.
Примечание. Выполнение поиска в потоке и прерывание его не гарантирует немедленного завершения вызова и не означает, что поток немедленно завершится.
Это особенно относится к случаям, когда вызов плохо работает или работает неправильно.
getaddrinfo()
- функция блокировки, которую вы не можете прервать.
В Windows 8 и более поздних версиях вместо этого вы можете использовать GetAddrInfoEx()
. Версия Unicode (GetAddrInfoExW()
) поддерживает тайм-аут, предоставляемый вызывающим абонентом, а также Overlapped I/O, или он может вернуть HANDLE
для асинхронной задачи, которая затем может быть передана в GetAddrInfoExCancel()
.
Насколько я вижу, GetAddrInfoExCancel() подчиняется гонке когда вы случайно можете отменить неправильную операцию. (Операция завершается коротким до вызова отмены и номер дескриптора повторно используется другой операцией) –
В частности, вы можете использовать CancelSynchronousIo, чтобы попытаться отменить любую операцию ввода-вывода в указанном потоке. Особенно важно, чтобы вы не использовали TerminateThread, см., Например, https://blogs.msdn.microsoft.com/oldnewthing/20150814-00/?p=91811 –