Discussion:
Error al crear hilos
(demasiado antiguo para responder)
JL
2005-03-29 19:43:38 UTC
Permalink
Hola colegas informáticos:
He desarrollado una aplicación multihilos que corre en un Red Hat Advanced
Server 2.1. Lo que hace es muy sencillo: el hilo principal está escuchando
un socket y al recibir datos en el mismo crea un hilo que atienda la
transacción. El problema es que llega un momento en que ya no puede seguir
creando hilos, por más que nunca tuve más de 5 hilos concurrentes.
En anteriores consultas me sugirieron que quizá no he estado liberando algún
recurso, así que me puse a buscar un poquito por Google si alguien tuvo
algún problema parecido y encontré el siguiente código:

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 255 /* Esta linea decía 5 pero la modifiqué yo para la
prueba que quería hacer */

void *PrintHello(void *threadid)
{
printf("\n%d: Hello World!\n", threadid);
pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc, t;
for(t=0;t<NUM_THREADS;t++){
printf("Creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
pthread_exit(NULL);
}

Al ejecutar este programa, obtengo el mismo resultado que con mi aplicativo
al llegar al hilo 255:

Creating thread 255
ERROR; return code from pthread_create() is 11

Es el mismo código de error de mi aplicación y al igual que en ella en este
programa tampoco son concurrentes los hilos: a medida que se van creando los
siguientes hilos los primeros ya han terminado su ejecución.
Alguno tiene idea de qué puede estar pasando ?.

Desde ya, muy agradecido

JL
Pascal Bourguignon
2005-03-29 21:41:51 UTC
Permalink
Post by JL
He desarrollado una aplicación multihilos que corre en un Red Hat Advanced
Server 2.1. Lo que hace es muy sencillo: el hilo principal está escuchando
un socket y al recibir datos en el mismo crea un hilo que atienda la
transacción. El problema es que llega un momento en que ya no puede seguir
creando hilos, por más que nunca tuve más de 5 hilos concurrentes.
En anteriores consultas me sugirieron que quizá no he estado liberando algún
recurso, así que me puse a buscar un poquito por Google si alguien tuvo
Pues en los tiempos antigüos, no teniamos el Web y el acceso a
Internet estaba bastante restringido. Entonces pasabamos las largas
noches de invierno _leyendo_ las páginas de manual.

man pthread_exit
man pthread_create

Muy importante: siempre leer las páginas citadas en SEE ALSO. Luego:

man pthread_join

When a joinable thread terminates, its memory resources (thread
descriptor and stack) are not deallocated until another thread
performs pthread_join on it. Therefore, pthread_join must be
called once for each joinable thread created to avoid memory
leaks.


man pthread_detach

pthread_detach put the thread th in the detached state. This
guarantees that the memory resources consumed by th will be freed
immediately when th terminates. However, this prevents other
threads from synchronizing on the termination of th using
pthread_join.
--
__Pascal Bourguignon__ http://www.informatimago.com/

In a World without Walls and Fences,
who needs Windows and Gates?
JL
2005-03-29 22:38:09 UTC
Permalink
Post by Pascal Bourguignon
Pues en los tiempos antigüos, no teniamos el Web y el acceso a
Internet estaba bastante restringido. Entonces pasabamos las largas
noches de invierno _leyendo_ las páginas de manual.
Sucede que en este hemisferio es recién otoño y las noches no son tan largas
:-p
Luego de tu _llamada de atención_ me puse a revisar un código anterior en el
que ya había intentado el pthread_detach sin éxito y le encontré una falla
que hacía que el hilo no recibiera correctamente el thread_id, por eso no me
había funcionado.
Una vez corregido el error, ya puedo crear hilos hasta el infinito :-D
Gracias Pascal !!

Un saludo,

JL
Julio Castro
2005-03-29 22:51:21 UTC
Permalink
Post by JL
He desarrollado una aplicación multihilos que corre en un Red Hat Advanced
Server 2.1. Lo que hace es muy sencillo: el hilo principal está escuchando
un socket y al recibir datos en el mismo crea un hilo que atienda la
transacción. El problema es que llega un momento en que ya no puede seguir
creando hilos, por más que nunca tuve más de 5 hilos concurrentes.
En anteriores consultas me sugirieron que quizá no he estado liberando algún
recurso, así que me puse a buscar un poquito por Google si alguien tuvo
#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 255 /* Esta linea decía 5 pero la modifiqué yo para la
prueba que quería hacer */
void *PrintHello(void *threadid)
{
printf("\n%d: Hello World!\n", threadid);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc, t;
for(t=0;t<NUM_THREADS;t++){
printf("Creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
pthread_exit(NULL);
}
Al ejecutar este programa, obtengo el mismo resultado que con mi aplicativo
En este ejemplo, NUM_THREADS, está indicando el número máximo de hilos
que puedes tener abiertos al mismo tiempo y como la tienes puesta a
255 ese es justo el número de sesiones que puedes abrir sin cerrar
ninguna otra.
Lo que debes hacer es un control para averiguar que hilos quedan
libres a medida que se van cerrando y de esa forma, podrás
reaprovechar los threads[t] para las nuevas conexiones, pudiendo
llegar a tener hasta 255 abiertos a la vez en función del valor de la
constante NUM_THREADS que has definido.

En mi empresa hemos realizado un sistema comercial (aqui podreis
encontrar más información http://www.dims.com/dgp21.php) basado en
hilos que da juego a un máximo de 100 usuarios por sesión y varias
sesiones lanzadas en un mismo servidor, y en algunas ocasiones el
sistema ha estado más de un mes sin reiniciarse y no ha dado ningún
problema (Red Hat 9).

Un saludo a todos.
JL
2005-03-30 20:20:57 UTC
Permalink
Muy importante el aporte de Pascal para despabilarme e investigar mejor el
problema antes de pedir ayuda al grupo.
No obstante, como ya no estamos en los tiempos antigüos y el acceso a la web
es por demás fácil y sencillo volví a consultar con "San Google" y obtuve
este link, que me ha permitido (ahora sí) solucionar definitivamente el
problema de los hilos.
http://access1.sun.com/techarticles/limit.html

Salu2,

JL

Loading...