Question

J'ai des 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. "

Ceci est 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 "le système manquait des ressources nécessaires". Ma question est (et c'est peut-être un peu stupide) - quelles sont ces ressources? C’est vraisemblablement une fuite de mémoire dans mon programme (certainement possible, probablement même), mais j’aurais pensé que, même dans ce cas, il pourrait en gérer plus de 300, le reste 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 mémoire libre, donc il y a probablement une limite artificielle imposée par le système d'exploitation (Linux).

Merci

Était-ce utile?

La solution

Si vous ne créez pas le fil avec l'attribut PTHREAD_CREATE_DETACHED (ou en 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 lui sont associées.

Autres conseils

Peut-être un peu exagéré (?) mais Valgrind peut vous aider à localiser les marquages ??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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top