Zajmuję się tworzeniem aplikacji, która ma jeden serwer TCP i kilka serwerów/detektorów UDP. Każdy serwer jest osobnym wątkiem, tak samo jak wątki robocze dla ustalonych połączeń TCP. Nazywam WSAStartup() w każdym wątku.Czy wywołanie funkcji WSAStartup() z kilku wątków może spowodować zakleszczenie?
Czasami wywołanie funkcji WSAStartup() zawiesza się (dla mnie wygląda jak zakleszczenie). Oto ślad stosu:
[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
Ten impas występuje podczas fazy inicjalizacji. Widzę, że serwer TCP został uruchomiony i że ustanowiono jedno połączenie TCP, podczas gdy uruchamiany jest tylko jeden z serwerów UDP. Śledzenie stosu pochodzi z funkcji, która powinna zainicjować pozostałe serwery UDP. Zgaduję, że podczas gdy próbuję zainicjować serwer UDP i wywołanie funkcji WSACStartup(), inny bieżnik obsługuje inną operację na gnieździe, na przykład nowe połączenie TCP, a także wywołuje funkcję WSAStartup()?
Moje pytanie brzmi, czy wywołanie funkcji WSAStartup() z kilku wątków może spowodować ten zakleszczenie? Sprawdziłem również WSACleanup() wywołana przed impasem, a nie jest. Wykonanie nigdy nie osiąga żadnego z WSACleanup().
Zdaję sobie sprawę, że tylko jedno wywołanie funkcji WSAStartup powinno wystarczyć, ale nazywając WSAStartup (kilka razy) nie powinno być problemem (MSDN] 1): „Aplikacja może wywołać WSAStartup więcej niż jeden raz, jeśli to konieczne uzyskać więcej informacji o strukturze WSADATA więcej niż jeden raz. " Dlatego chciałbym ustalić, czy ten impas jest spowodowane przez WSAStartup() lub coś innego.
To nie jest odpowiedź na pytanie, ale czy należy rozważyć użycie doładowania ASIO (http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio.html)?Miałem o wiele łatwiejsze rozwiązanie problemów takich jak twoja z tą biblioteką. – nabulke
Nikolai, użyłem doładowania przed i lubię to. Odkąd uruchomiłem tę aplikację z WinSock, chciałbym przejść do sedna tego problemu. Po prostu ciekawy chyba :) –
Czy patrzyłeś na stosy połączeń innych wątków? –