Я разрабатываю приложение с одним TCP-сервером и несколькими UDP-серверами/слушателями. Каждый сервер представляет собой отдельный поток, такой же, как рабочие потоки для установленных TCP-соединений. Я вызываю WSAStartup() в каждом из потоков.
Иногда вызов WSAStartup() зависает (мне это кажется тупиком). Вот трассировка стека:
ntdll.dll!_KiFastSystemCallRet@0()
ntdll.dll!_ZwWaitForSingleObject@12() + 0xc bytes
ntdll.dll!_RtlpWaitForCriticalSection@4() + 0x8c bytes
ntdll.dll!_RtlEnterCriticalSection@4() + 0x46 bytes
ntdll.dll!_LdrpGetProcedureAddress@20() + 0x17d bytes
ntdll.dll!_LdrGetProcedureAddress@16() + 0x18 bytes
kernel32.dll!_GetProcAddress@8() + 0x3e bytes
vld.dll!03203723()
[Frames below may be incorrect and/or missing, no symbols loaded for vld.dll]
ws2_32.dll!CheckForHookersOrChainers() + 0x22 bytes
ws2_32.dll!_WSAStartup@8() + 0xa7 bytes
Этот тупик происходит во время фазы инициализации. Я вижу, что TCP-сервер запущен и установлено одно TCP-соединение, при этом запущен только один из UDP-серверов. Трассировка стека исходит от функции, которая должна инициировать остальные серверы UDP. Я предполагаю, что пока я пытаюсь инициализировать UDP-сервер и вызывать WSACStartup(), другой поток обрабатывает другую операцию сокета, например, новое TCP-соединение, и он также вызывает WSAStartup()?
Мой вопрос заключается в том, может ли вызов WSAStartup() из нескольких потоков вызвать этот тупик? Также я проверил, вызывается ли WSACleanup() до взаимоблокировки, и это не так. Выполнение никогда не достигает ни одного из WSACleanup().
Я знаю, что только одного вызова WSAStartup должно быть достаточно, но вызов WSAStartup() несколько раз не должен быть проблемой (MSDN]1): "Приложение может вызывать WSAStartup более одного раза, если ему необходимо получить информацию о структуре WSADATA более одного раза". Следовательно, я хотел бы установить, вызван ли этот тупик WSAStartup() или чем-то еще.
WSAStartup
из нескольких потоков. Это вызвано тем, что вы вызываете его изDllMain
(или из того, что вы решили назвать своей точкой входа в DLL). На это уже указывал @Luke, но, поскольку вы решили проигнорировать это, я подумал, что подниму этот вопрос снова. - person IInspectable   schedule 11.12.2014