Pourquoi pthread_create () échouerait-il avec seulement 2 threads actifs?

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

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

Ce ne sont pas 303 threads en même temps – chaque thread se ferme, ce 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 manquait 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 ainsi, il pourrait gérer plus de 300 personnes, le rest du programme ne produisant que très peu.

Comment connaître la quantité de mémoire disponible dans mon programme pour confirmer son épuisement? Il y a beaucoup de mémoire et de permutation libre, donc probablement une limite artificielle imposée par le système d’exploitation (Linux).

Merci

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

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

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