2009-03-08 9 views
6

Tengo problemas en mi primera incursión en hilos en C. Estoy intentando (por ahora) escribir un programa de servidor muy simple que acepte una conexión de socket y comience un nuevo hilo para procesarlo. Parece funcionar bien, excepto que solo creará unos 300 hilos (303, a veces 304) antes de que pthread_create() falle con el código EAGAIN, lo que significa:¿Por qué pthread_create() falla con solo 2 subprocesos activos?

"El sistema carecía de los recursos necesarios para crear otro hilo, o se excedería el límite impuesto por el sistema sobre el número total de subprocesos en un proceso {PTHREAD_THREADS_MAX} ".

Esto es no 303 hilos al mismo tiempo - cada hilo sale, lo que es confirmado por gdb. Cada vez que se llama a la función de solicitud de proceso hay dos hilos en ejecución.

Lo que significa que "el sistema carecía de los recursos necesarios". Mi pregunta es (y puede ser un poco estúpido) ¿cuáles son estos recursos? Es de suponer que es una pérdida de memoria en mi programa (ciertamente posible, incluso probable), pero hubiera pensado que incluso así podría manejar más de 300 considerando que el resto del programa hace muy poco.

¿Cómo puedo saber cuánta memoria tiene mi programa disponible para confirmar que se está quedando sin ella? Hay mucha memoria y libre de intercambio, así que presumiblemente hay un límite artificial impuesto por el sistema operativo (Linux).

Gracias

+0

Se puede publicar ¿El fragmento de código que crea y destruye los hilos? –

Respuesta

10

Si no está creando el hilo con el atributo PTHREAD_CREATE_DETACHED (o quitar con pthread_detach(), puede que tenga que llamar a pthread_join() en cada subproceso creado después de que salga a liberar los recursos asociados a ella.

+0

¡Gracias! Acaba de establecer ese atributo y se ha ido más allá de 4000 hilos y contando. Muchas gracias, eso es aproximadamente 3 horas de frustración corregida :) – Ray2k

0

Posiblemente un poco exagerado (?), Pero Valgrind puede ayudar a localizar memleaks en Linux.

¿Podría publicar algunos fragmentos de código? Preferiblemente las partes donde asigna/libera memoria/sockets y donde crea sus hilos.

Cuestiones relacionadas