Por que Pthread_Create () falharia com apenas 2 threads ativos?
-
05-07-2019 - |
Pergunta
Estou tendo alguns problemas na minha primeira incursão em threads em C. Estou tentando (por enquanto) escrever um programa de servidor muito simples que aceita uma conexão de soquete e inicia um novo thread para processá -lo. Parece funcionar bem, exceto que ele criará apenas cerca de 300 threads (303, às vezes 304) antes de pthread_create () falhar com o código EAGAIN, o que significa:
"O sistema não possuía os recursos necessários para criar outro segmento ou o limite imposto pelo sistema para o número total de encadeamentos em um processo {pthread_threads_max} seria excedido".
Isto é não 303 Trevas ao mesmo tempo - cada thread sai, que é confirmado pelo GDB. Cada vez que a função de solicitação de processo é chamada, há dois threads em execução.
Por isso, significa "o sistema não possuía os recursos necessários". Minha pergunta é (e pode ser um pouco estúpido) - quais são esses recursos? Presumivelmente, é um vazamento de memória no meu programa (certamente possível, provavelmente até), mas eu pensaria que, mesmo assim, poderia administrar mais de 300, considerando que o restante do programa faz muito pouco.
Como posso descobrir quanta memória meu programa está disponível para confirmar que está ficando sem ele? Há muita memória e troca livre, então presumivelmente há um limite artificial imposto pelo sistema operacional (Linux).
Obrigado
Solução
Se você não está criando o tópico com o atributo PTHREAD_CREATE_DETACHED
(ou destacando -os com pthread_detach()
, você pode precisar ligar pthread_join()
Em cada thread criado depois de sair para liberar os recursos associados a ele.
Outras dicas
Possivelmente um pouco de exagero (?) Mas Valgrind pode ajudá -lo a localizar memleaks no Linux.
Talvez você possa postar alguns trechos de código? De preferência, as peças em que você aloca a memória/soquetes livres e onde cria seus threads.