2009-03-08 5 views
6

J'ai quelques problèmes dans ma première incursion dans les threads en C. J'essaie (pour l'instant) d'écrire un programme serveur très simple qui accepte une connexion socket et démarre un nouveau thread pour le traiter. Il semble fonctionner correctement sauf qu'il ne créera qu'environ 300 threads (303, parfois 304) avant que pthread_create() échoue avec le code EAGAIN, ce qui signifie:Pourquoi pthread_create() échouerait avec seulement 2 threads actifs?

"Le système ne disposait pas des ressources nécessaires pour créer un autre thread, ou la limite imposée par le système sur le nombre total de threads dans un processus {PTHREAD_THREADS_MAX} serait dépassée. "

Ceci est pas 303 threads en même temps - chaque fil sort qui est confirmé par gdb. Chaque fois que la fonction de demande de processus est appelée, deux threads sont en cours d'exécution. Cela signifie donc que «le système ne disposait pas des ressources nécessaires». Ma question est (et c'est peut-être un peu stupide): quelles sont ces ressources? Vraisemblablement c'est une fuite de mémoire dans mon programme (certainement possible, probablement même), mais j'aurais pensé que même si ça pouvait gérer plus de 300 vu que le reste du programme faisait très peu.

Comment puis-je connaître la quantité de mémoire disponible pour mon programme afin de confirmer qu'il n'y en a plus? Il y a beaucoup de mémoire et d'échange libre, donc il y a probablement une limite artificielle imposée par le système d'exploitation (Linux).

Merci

+0

peut vous poster l'extrait de code qui crée et détruit les threads? –

Répondre

10

Si vous ne créez pas le fil avec l'attribut PTHREAD_CREATE_DETACHED (ou les détachant avec pthread_detach(), vous devrez peut-être appeler pthread_join() sur chaque thread créé après sa sortie pour libérer les ressources qui y sont associées.

+0

Merci, il suffit de définir cet attribut et il est bien passé 4000 fils et compte.Merci merci - c'est environ 3 heures de frustration corrigé :) – Ray2k

0

Peut-être un peu exagéré (?), Mais Valgrind peut vous aider à localiser memleaks sous Linux.

Pourriez-vous poster des extraits de code? De préférence les parties où vous allouez/libérez de la mémoire/sockets et où vous créez vos threads.

Questions connexes