我正在开发一个具有一个TCP服务器和多个UDP服务器/侦听器的应用程序。每个服务器都是独立的线程,与建立TCP连接的工作线程相同。我在每个线程中调用WSAStartup()。从几个线程调用WSAStartup()会导致死锁吗?
有时,调用WSAStartup()会挂起(它看起来像是一个死锁)。以下是堆栈跟踪:
[email protected]()
[email protected]() + 0xc bytes
[email protected]() + 0x8c bytes
[email protected]() + 0x46 bytes
[email protected]() + 0x17d bytes
[email protected]() + 0x18 bytes
[email protected]() + 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
[email protected]() + 0xa7 bytes
这种死锁发生在初始化失败期间。我看到TCP服务器已启动,并且建立了一个TCP连接,而只有一个UDP服务器启动。堆栈跟踪来自应该启动其余UDP服务器的功能。我的猜测是,当我尝试初始化UDP服务器并调用WSACStartup()时,另一个步骤是处理另一个套接字操作,例如新的TCP连接,它也调用WSAStartup()?
我的问题是,从几个线程调用WSAStartup()是否会导致此死锁? 另外我检查的是死锁之前调用的WSACleanup(),它不是。执行永远不会达到任何WSACleanup()。
我知道,只有一个调用来调用WSAStartup应该是足够的,但调用WSAStartup()几次不应该是一个问题(MSDN] 1): “应用程序可以调用调用WSAStartup不止一次是否需要多次获取WSADATA结构信息。“ 因此,我想确定这个死锁是由WSAStartup()还是其他引起的。
这是不回答你的问题,但你考虑使用升压ASIO(http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio.html )?我有一个更容易的时间解决像你这样的图书馆的问题。 – nabulke 2010-08-05 17:57:51
尼古拉,我之前用过这个提升,喜欢它。自从我用WinSock开始这个应用程序之后,我想深入了解这个问题。只是为了好奇我猜:) – 2010-08-05 18:30:15
你看过你的其他线程的调用栈吗? – 2010-08-05 18:33:42