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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top