Ich entwickle eine App, die einen TCP-Server und mehrere UDP-Server/Listener hat. Jeder Server ist ein separater Thread, genauso wie die Worker-Threads für etablierte TCP-Verbindungen. Ich rufe WSAStartup() in jedem der Threads auf.Kann Aufruf von WSAStartup() aus mehreren Threads einen Deadlock verursachen?
Manchmal hängt Aufruf von WSAStartup() (es sieht für mich wie ein Deadlock aus). Hier ist der Stack-Trace:
[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
Dieser Deadlock geschieht während der Initialisierung faze. Ich sehe, dass der TCP-Server gestartet wird und dass eine TCP-Verbindung hergestellt wird, während nur einer der UDP-Server gestartet wird. Der Stack-Trace stammt von der Funktion, die den Rest der UDP-Server initiieren soll. Meine Vermutung ist, dass, während ich versuche, UDP-Server zu initieren und WSACStartup() aufzurufen, ein anderes Profil eine andere Socket-Operation behandelt, zum Beispiel eine neue TCP-Verbindung, und es ruft auch WSAStartup() auf?
Meine Frage ist, ob Aufruf von WSAStartup() aus mehreren Threads diesen Deadlock verursachen kann? Auch überprüft habe ich die WSACleanup() vor dem Deadlock aufgerufen, und es ist nicht. Die Ausführung erreicht niemals WSACleanup().
Ich bin mir bewusst, dass nur ein Aufruf an WSAStartup genug sein sollte, noch ruft WSAStartup (mehrmals) sollte kein Problem (MSDN] 1) sein: „Eine Anwendung aufrufen kann mehr als einmal WSAStartup wenn es braucht, um Erhalten Sie die WSADATA-Strukturinformationen mehr als einmal. " Daher möchte ich feststellen, ob dieser Deadlock durch WSAStartup() oder etwas anderes verursacht wird.
Das ist keine Antwort auf Ihre Frage, aber finden Sie Boost Asio mit (http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio.html)Ich hatte viel leichter Probleme mit der Bibliothek zu lösen. – nabulke
Nikolai, ich habe den Boost vorher benutzt und mag es. Seit ich diese App mit WinSock gestartet habe, möchte ich dem Thema auf den Grund gehen. Nur zu neugierig, denke ich :) –
Hast du die Callstacks deiner anderen Threads angeschaut? –