Sto sviluppando un'applicazione con un server TCP e diversi server/ascoltatori UDP. Ogni server è un thread separato, uguale ai thread worker per le connessioni TCP stabilite. Sto chiamando WSAStartup() in ciascuno dei thread.La chiamata a WSAStartup() da più thread può causare un deadlock?
A volte, la chiamata WSAStartup() si blocca (mi sembra un deadlock). Ecco l'analisi dello stack:
[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
Questo deadlock avviene durante la faze inizializzazione. Vedo che il server TCP viene avviato e che viene stabilita una connessione TCP, mentre viene avviato solo uno dei server UDP. La traccia dello stack proviene dalla funzione che dovrebbe avviare il resto dei server UDP. La mia ipotesi è che mentre sto cercando di avviare UDP sever e chiamare WSACStartup(), un altro battistrada sta gestendo un'altra operazione di socket, ad esempio una nuova connessione TCP e chiama anche WSAStartup()?
La mia domanda è se chiamare WSAStartup() da più thread può causare questo deadlock? Inoltre, ho controllato che WSACleanup() chiamato prima del deadlock, e non lo è. L'esecuzione non raggiunge mai nessuno di WSACleanup().
Sono consapevole del fatto che solo una chiamata a WSAStartup dovrebbe essere sufficiente, ma chiamando WSAStartup() più volte, non dovrebbe essere un problema (MSDN] 1): "Un'applicazione può chiamare WSAStartup più di una volta se ha bisogno di ottenere le informazioni sulla struttura WSADATA più di una volta. " Quindi, vorrei stabilire se questo deadlock è causato da WSAStartup() o qualcos'altro.
Questa non è una risposta alla tua domanda, ma lo considerano usare il boost ASIO (http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio.html)?Ho avuto molto più tempo per risolvere problemi come il tuo con quella libreria. – nabulke
Nikolai, ho usato la spinta prima e mi piace. Da quando ho avviato questa app con WinSock mi piacerebbe andare in fondo a questo problema. Solo per i curiosi, immagino :) –
Hai guardato gli stack di chiamate degli altri thread? –