有时候,调用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): “如果需要多次获取WSADATA结构信息,则应用程序可以多次调用WSAStartup。” 因此,我想确定这个死锁是由WSAStartup()还是其他原因引起的。
WSAStartup
引起的。而是由于从DllMain
(或者你决定称之为DLL入口点的任何函数)中调用它。这已经被@Luke指出,但由于你决定忽略它,我想再次提出来。 - IInspectable