2009-05-10 5 views
1

Je suis la conception d'un cadre de mise en réseau qui utilise WSAEventSelect pour les opérations asynchrones. Je génère un thread pour chaque socket 64e en raison de la limite de 64 événements par thread, et tout fonctionne comme prévu, sauf pour une chose:Winsock engendre de façon incontrôlable plusieurs, fils persistants

Les threads continuent à être générés de manière incontrôlable par Winsock lors de la connexion et la déconnexion, threads qui ne vont pas un moyen.

Avec la conception actuelle de la structure, deux threads doivent être en cours d'exécution lorsque seulement quelques sockets sont actifs. Et comme prévu, deux threads fonctionnent au total. Cependant, quand je me connecte avec quelques sockets (1 à 5 sockets), 3 threads supplémentaires sont spawn qui persistent jusqu'à ce que je ferme l'application. En outre, lorsque je perds la connexion sur l'une des sockets, 2 threads supplémentaires sont générés (persistant également jusqu'à la fermeture). C'est 7 threads au total, dont 5 je n'ai aucune idée de ce qu'ils sont là pour.

Si elles sont requises par Winsock pour la connexion ou autre, puis disparaît, ce serait bien. Mais cela me dérange qu'ils persistent jusqu'à ce que je ferme ma demande.

Y a-t-il quelqu'un qui pourrait nous éclairer à ce sujet? Peut-être une solution pour éviter ces threads ou les forcer à se fermer quand aucune connexion n'est active?

(application est écrit en C++ avec Win32 et Winsock 2,2)


Informations Process Explorer:

sujets attendus:
MyApp.exe WinMainCRTStartup
MyApp. exe! Netfw :: NetworkThread :: ThreadProc

fils inattendus:
ntdll.dll RtlpUnWaitCriticalSection + 0x2dc
mswsock.dll + 0x7426
ntdll.dll RtlGetCurrentPeb + 0x155
ntdll.dll RtlGetCurrentPeb + 0x155
ntdll.dll RtlGetCurrentPeb + 0x155

!!!

Tous les fils inattendus ont des piles d'appels avec des appels à des fonctions telles que ntkrnlpa.exe!IoSetCompletionRoutineEx+0x46e ce qui signifie sans doute qu'il est une partie du mécanisme de notification.

+0

Les threads s'additionnent-ils ou font-ils partie d'un pool de threads internes à winsock, qui conserve ces threads dans un pool? – Lucero

+0

@Lucero - Je vais faire quelques tests afin de déterminer. Merci. – haste

Répondre

1

Téléchargez l'outil sysinternals process explorer. Installez le debugging tools for windows approprié. Dans l'explorateur de processus, définir les options -> Chemin Symboles à:

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

Où C: \ Websymbols est juste un endroit pour stocker le cache de symbole (je créer un nouveau répertoire vide pour elle.)

Maintenant, vous pouvez inspecter votre programme avec l'explorateur de processus. Double-cliquez sur le processus, allez dans l'onglet des threads, et il vous montrera où les threads ont commencé, à quel point ils sont occupés, et quelle est leur callstack actuelle.

Cela vous donne généralement une très bonne idée de ce que sont les threads. Si ce sont des threads internes de Winsock, je ne m'en soucierais pas, même s'il y en a des centaines.

+0

Merci pour le conseil. J'ai mis à jour le message avec des informations à partir de l'Explorateur de processus et il semble que ce soit des threads internes Winsock utilisés pour le mécanisme de notification. – haste

+0

Cool, on dirait que ce sont des threads winsock qui attendent sur un port d'achèvement du noyau. Ces fils ne consomment pratiquement aucune ressource pendant leur sommeil. Donc je suppose que c'est un cas où tout fonctionne comme prévu. – Andomar

1

Une direction à regarder (juste une supposition): S'il s'agit de connexions TCP, il peut s'agir de threads d'arrière-plan pour gérer les temporisateurs TCP internes. Je ne sais pas pourquoi ils utiliseraient un thread par connexion, mais quelque chose doit faire le travail d'arrière-plan là.