C/Visual C - Problema 500 g_thread_create

 
Vista:

Problema 500 g_thread_create

Publicado por Esther (8 intervenciones) el 24/08/2007 08:43:22
Hola a todos, quiero crear 500 hilos y que cada hilo me cree un fichero y escriba en él la fecha y la hora actual.
Descripción del hardware:
- CPU: Intel (R) Pentium (R) 4 CPU 1.60 GHz
- RAM: 256 MB
Descripción Paquetes:
- SO: White Box Enterprise 4.0
- Glibc 2.3.4-3
- Glib2-2.4.7-1
- Glib2-devel-2.4.7-1
- Glibc-devel-2.3.4-2
- Gcc 3.4.3-9
El problema que tengo es que si utilizo los hilos de la glib (g_thread) me permite crear 302 hilos, y me da el siguiente mensaje de error:
GThread-ERROR**: file gthred-posix.c: line 351() error ‘No se pudo asignar memoria during ‘ pthread-create
En cambio si utilizo los hilos de C (pthread) si me crea el número de hilos que deseo (500) . ¿Alguien sabe por qué me pasa esto ?
Código que estoy usando:
#include<gtk/gtk.h>
#include<stdlib.h>
#include<glib.h>
#include<stdio.h>
#include<time.h>
#include<dlfcn.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<pthread.h>
GThreadFunc funcion1(gint i)
{
FILE *FCH;
gchar fecha[80]={0}, cadena[100]={0},nfuncion[5]={0};
struct tm *fecha_hora;
time_t cronometro;
while(1)
{
sprintf(nfuncion,”%d”,i);
strcpy(cadena,”fic”);
strcat(cadena,nfuncion);
FCH=fopen(cadena,”r+”);
If(FCH == NULL)
{
FCH=fopen(cadena,”a+”);
fclose(FCH);
FCH=fopen(cadena,”r+”);
}
time(&cronometro);
fecha_hora=localti me(&cronometro);
strftime(fecha,80,”[%d-%m-%Y][%X]\n”,fecha_hora);
fseek(FCH,0,SEEK_END);
fprintf(FCH,fecha);
fclose(FCH);
usleep(1000);
}
}
void iniciarFF500()
{
gint i=0;
GThread *hilo
while(i<500)
{
hilo=g_thread_create(funcion1, I ,TRUE,NULL);
i++;
}
}
gint main(int argc,char *argv[])
{
if(g_thread_supported())
g_thread_init(NULL);
gtk_init(&argc,&argv);
iniciarFF500();
g_threads_enter();
gtk_main();
gdk_threads_leave();
return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema 500 g_thread_create

Publicado por nayumi (53 intervenciones) el 24/08/2007 09:14:25
Holas Esther,

primero no entiendo para que quieres hacer una aplicación que maneje 500 hilos. Esto es una barbaridad. Si tienes que ampliar tu aplicacion y sincronizar los hilos, creo que vas a tener bastantes problemas

Creo que tu problema es que te estas quedando sin memoria (256Mb es muy poco) para reservar el espacio de memoria que necesitan los hilos.

Deberías replantear el análisis funcional de tu aplicación.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema 500 g_thread_create

Publicado por Esther (8 intervenciones) el 24/08/2007 11:34:49
Hola, muchas gracias por contestar.
Al ejecutar el programa, he mirado el consumo de memoria y el consumo de la CPU con el top al crear los hilos, tanto con g_thread-create como con pthread_create y en ambos casos el consumo de memoria es de 1,4 y el de la CPU es de 0,3, por tanto la memoria RAM de mi ordenador no creao que sea el fallo, por que si fuese así no permitiría crear 500 hilos de nimguna manera, en cambio con pthread_create no hay ningún problema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema 500 g_thread_create

Publicado por Tom (619 intervenciones) el 24/08/2007 11:23:49
Fácil:
Te pasa porque glib usa más memoria que pthread ¿o no?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema 500 g_thread_create

Publicado por Esther (8 intervenciones) el 24/08/2007 11:36:24
Hola, muchas gracias por contestar.
Al ejecutar el programa, he mirado el consumo de memoria y el consumo de la CPU con el top al crear los hilos, tanto con g_thread-create como con pthread_create y en ambos casos el consumo de memoria es de 1,4 y el de la CPU es de 0,3, por tanto la memoria RAM de mi ordenador no creao que sea el fallo, por que si fuese así no permitiría crear 500 hilos de nimguna manera, en cambio con pthread_create no hay ningún problema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema 500 g_thread_create

Publicado por Tom (619 intervenciones) el 27/08/2007 12:21:32
Mira, el error que te da es claro: No hay memoria.

Usa pthread, que es una implementación estandarizada, robusta y mejor soportada por el kernel.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema 500 g_thread_create

Publicado por esther (8 intervenciones) el 28/08/2007 11:16:26
Gracias Tom.

Bien entiendo que los gthreads, estan implementados en base a los threads, y lo unico que hace la glib es hacerlos por tables a diferentes S.O.

Tengo dos hipotesis por el momento:
1. Que sea un problema de la version de la glib que estoy utilizando. "no se alguien que utilice otra version mas actualiza tiene el mimos problema". ?.
2. Que sea un parametro de configuracion que tenga que modificar ?.

Bueno, haber si me las puedo responder.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema 500 g_thread_create

Publicado por Tom (619 intervenciones) el 28/08/2007 13:01:36
Pues me temo que entiendes mal :-)
Gthreads es (o era) una implementación completa de threads a nivel de usuario (user-level, o sea, fuera del kernel), y se empezó a usar aún cuando el kernel no tenía ningún soporte específico (incluso algunas señales estaban mal gestionadas).
Quizás alguna versión relativamente reciente utilice wrappers hacia pthreads, pero seguirá siendo algo más lenta y pesada en memoria (entre otras cosas, porque seguirá usando un "monitor" y código especialmente diseñado para coordinar las distintas rutinas de glib).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar