Domanda

Sto progettando un framework di rete che utilizza WSAEventSelect per operazioni asincrone. Ho generato un thread per ogni 64 ° socket a causa del massimo 64 eventi per limitazione del thread e tutto funziona come previsto tranne una cosa:

I thread continuano a essere generati in modo incontrollato da Winsock durante la connessione e la disconnessione, thread che non spariranno.

Con l'attuale progetto del framework, due thread dovrebbero essere in esecuzione quando sono attivi solo pochi socket. E come previsto, due thread sono in esecuzione in totale. Tuttavia, quando mi collego con alcuni socket (1-5 socket), vengono generati altri 3 thread che persistono fino alla chiusura dell'applicazione. Inoltre, quando perdo la connessione su uno qualsiasi dei socket, vengono generati altri 2 thread (persistendo fino alla chiusura). Sono 7 discussioni in totale, 5 delle quali non ho idea di cosa ci siano.

Se fossero richiesti da Winsock per la connessione o altro e poi fossero scomparsi, sarebbe andato tutto bene. Ma mi dà fastidio che persistano fino a quando non chiudo la mia domanda.

C'è qualcuno che potrebbe far luce su questo? Forse una soluzione per evitare questi thread o costringerli a chiudere quando non sono attive connessioni?

(L'applicazione è scritta in C ++ con Win32 e Winsock 2.2)


Informazioni da Process Explorer:

Discussioni previste:
MyApp.exe! WinMainCRTStartup
MyApp.exe! Netfw :: NetworkThread :: ThreadProc

Discussioni impreviste:
ntdll.dll! RtlpUnWaitCriticalSection + 0x2dc
mswsock.dll + 0x7426
ntdll.dll! RtlGetCurrentPeb + 0x155
ntdll.dll! RtlGetCurrentPeb + 0x155
ntdll.dll! RtlGetCurrentPeb + 0x155

Tutti i thread inattesi hanno stack di chiamate con chiamate a funzioni come ntkrnlpa.exe!IoSetCompletionRoutineEx+0x46e che probabilmente significa che fa parte del meccanismo di notifica.

È stato utile?

Soluzione

Scarica lo strumento sysinternals explorer di processo . Installa gli strumenti di debug appropriati per Windows . In Process Explorer, imposta Opzioni - & Gt; Percorso dei simboli a:

SRV*C:\Websymbols*http://msdl.microsoft.com/download/symbols

Dove C: \ Websymbols è solo un posto dove archiviare la cache dei simboli (creerei una nuova directory vuota per essa.)

Ora puoi controllare il tuo programma con Process Explorer. Fai doppio clic sul processo, vai alla scheda dei thread e ti mostrerà dove sono iniziati i thread, quanto sono occupati e quale è il loro attuale callstack.

Questo di solito ti dà un'ottima idea di quali siano i thread. Se fossero thread interni di Winsock, non mi preoccuperei di loro, anche se ce ne fossero centinaia.

Altri suggerimenti

Una direzione in cui guardare (solo un'ipotesi): se si tratta di connessioni TCP, potrebbero trattarsi di thread in background per gestire i timer interni relativi al TCP. Non so perché dovrebbero usare un thread per connessione, ma qualcosa deve fare il lavoro in background lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top