我正在開發一個具有一個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