Discussion:
error al crear hilos
(demasiado antiguo para responder)
JL
2004-10-02 09:01:44 UTC
Permalink
Hola a todos
Tengo desarrollado un "driver" en lenguaje C que corre sobre Linux (RHAS
2.1). La función es bastante básica: el hilo principal está siempre
escuchando en un socket, al llegar una conexion crea un hilo que atienda la
misma y queda nuevamente esperando conexiones.
El problema es que llega un momento en que el hilo padre ya no puede seguir
creando hilos, es decir, la función pthread_create(&thread_id, &funcion,
NULL) me devuelve un valor distinto a cero.
Buscando en Google, encontré que alguno recomendaba poner el hilo "hijo" en
modalidad "detach" antes del pthread_exit(). Es decir:

pthread_detach(thread_id);
pthread_exit(NULL);

pero esto no ha solucionado el problema. Igualmente llega un momento en que
ya no pueden seguir creándose hilos.

Es esto un BUG o solamente una mala práctica de programación de mi parte ?

Salu2,

JL

PD: si necesitasen el código fuente completo, solo tienen que pedirlo.
Seba Ferro
2004-10-06 22:29:00 UTC
Permalink
Post by JL
Tengo desarrollado un "driver" en lenguaje C que corre sobre Linux (RHAS
2.1). La función es bastante básica: el hilo principal está siempre
escuchando en un socket, al llegar una conexion crea un hilo que atienda la
misma y queda nuevamente esperando conexiones.
El problema es que llega un momento en que el hilo padre ya no puede seguir
creando hilos, es decir, la función pthread_create(&thread_id, &funcion,
NULL) me devuelve un valor distinto a cero.
Buscando en Google, encontré que alguno recomendaba poner el hilo "hijo" en
pthread_detach(thread_id);
pthread_exit(NULL);
pero esto no ha solucionado el problema. Igualmente llega un momento en que
ya no pueden seguir creándose hilos.
Es esto un BUG o solamente una mala práctica de programación de mi parte ?
Tengo un programa muy similar al tuyo, escucha en un socket y crea hilos
para que atiendan la conexión. La máxima cantidad de hilos que tuve en paralelo
son aprox 50 y nunca tuve problemas. Corre sobre un SUN pero el fuente esta
compilado con gcc 2.95.
Me da la sensación que no es un BUG tu problema.
Buscá una variable que se llama MAX_THREAD_PER_PROC en donde se setéa
el número máximo de hilos por proceso.
Me parece que esa variabla puede estar seteada en /etc/system

Saludos
SF.-
JL
2004-10-07 13:20:16 UTC
Permalink
La máxima cantidad de hilos que tuve en paralelo son aprox 50 y nunca tuve
problemas.

A ver, creo que me expliqué mal. El problema no se presenta al crear hilos
en paralelo (nunca tuve más de 10 hilos trabajando en paralelo), sino que
ocurre cuando solo el hilo padre está activo y de repente entra un nuevo
pedido. Al entrar un pedido el programa crea un hilo. Este hilo hace lo
que tiene que hacer y termina (se cierra). Más tarde, entra otro pedido y
misma historia. Luego haberse repetido este proceso N veces, el hilo
principal no puede seguir creando hilos y en los logs aparece el fatídico
mensaje "No pudo crearse el hilo" para todos los siguientes pedidos
entrantes.
Buscá una variable que se llama MAX_THREAD_PER_PROC en donde se setéa
el número máximo de hilos por proceso.
Me parece que esa variabla puede estar seteada en /etc/system
En mi RHAS 2.1 no encontré referencia alguna a la variable que mencionas.
En todas las referencias a maxima cantidad de hilos que encuentro con GOOGLE
se menciona que la "cantidad de hilos por proceso" es "system dependent".
Esto me lleva a suponer que en todos los sistemas llegará un momento que tu
hilo "padre" ya no podrá crear hilos "hijos" porque ya ha alcanzado su
"maxima cantidad de hilos por proceso"
La única solución que se me ocurre es que al presentarse ese error el
programa se "suicide" y se vuelva a levantar. Ahora me pongo en campaña
para implentar esto.

De todos modos, muchas gracias
Salu2

JL
Julián Albo
2004-10-07 19:22:52 UTC
Permalink
Post by JL
pedido. Al entrar un pedido el programa crea un hilo. Este hilo hace lo
que tiene que hacer y termina (se cierra). Más tarde, entra otro pedido y
misma historia. Luego haberse repetido este proceso N veces, el hilo
principal no puede seguir creando hilos y en los logs aparece el fatídico
mensaje "No pudo crearse el hilo" para todos los siguientes pedidos
entrantes.
¿Y liberas los hilos que han terminado?
--
Salu2
Martin J. Sanchez
2004-10-08 08:42:34 UTC
Permalink
Post by JL
Hola a todos
Tengo desarrollado un "driver" en lenguaje C que corre sobre Linux (RHAS
2.1). La función es bastante básica: el hilo principal está siempre
escuchando en un socket, al llegar una conexion crea un hilo que atienda la
misma y queda nuevamente esperando conexiones.
El problema es que llega un momento en que el hilo padre ya no puede seguir
creando hilos, es decir, la función pthread_create(&thread_id, &funcion,
NULL) me devuelve un valor distinto a cero.
Buscando en Google, encontré que alguno recomendaba poner el hilo "hijo" en
pthread_detach(thread_id);
pthread_exit(NULL);
pero esto no ha solucionado el problema. Igualmente llega un momento en que
ya no pueden seguir creándose hilos.
Es esto un BUG o solamente una mala práctica de programación de mi parte ?
Cuando creas un thread con pthread_create y no especificas
PTHREAD_CREATE_DETACHED, el thread se crea con un atributo
PTHREAD_CREATE_JOINABLE. En este estado, los recursos del thread no se
liberan al terminar el thread, si no que se liberan cuando otro thread
haga un pthread_join para este thread.

En el estado detached, cuando el thread termina se liberan todos sus
recursos, pero entonces no se puede usar pthread_join para sincronizar
con el mismo.

Para cambiar el estado de un thread en estado joinable a detached se
usa pthread_detach. Esto pondra el thread dado en el estado detached y
por tanto se liberaran todos los recursos del mismo al terminar su
ejecucion.

Se me ocurre que quizas no estes poniendo el thread_id adecuado en la
llamada a pthread_detach. Comprueba el valor de retorno de las
llamadas pthread_create y pthread_detach. Prueba a poner
PTHREAD_CREATE_DETACHED en la llamada a pthread_create, o a poner
pthread_detach(pthread_self()) en el codigo del thread hijo justo
antes de la llamada a pthread_exit().

Un saludo,
Martin.

Loading...