No me queda del todo claro si tu problema es sólo la memoria no liberada.
Sí es así te cuento que es muy común eso, y que en todo caso tenés que
asegurarte de llamar a JOIN para todos los threads iniciados por tu
aplicación. Si aún así pierde memoria dentro del pthread_create() no te
preocupes. De todas formas observá que te dice que el bloque es perdido
"posiblemente". Esto quiere decir que al finalizar el programa la memoria no
se había liberado pero existían punteros a ese espacio de memoria.
No es bueno que tu programa haga algo así. Pero si esto se debe a una
biblioteca (pthread por ejemplo) que estás usando correctamente. no podés
hacer nada al respecto.
Con respecto al código que escribiste tené en cuenta:
1. Un código como:
thConsola.run(); //LINEA 28 de client_main.cpp
while (!thConsola.getCerrar()) {
}
thConsola.stop();
thConsola.join();
No tiene sentido alguno. Ya que el thread origen no hace nada y consume 100%
de CPU en el while. Luego bloquea en join(). Si esto lo escribiste sólo para
probar no hay problema.
Pero nunca está bien que un thread lance otro y luego espere que ese
finalice. Para eso no se necesitan dos threads.
2. Es interesante ver que la clase Consola no terminaría su thread nunca a
pesar de que llames al stop() si el usuario no presiona una tecla.
3. El método stop() de Thread no está llamando a la función STOP de pthread.
Si eso es verdadero está bien que lo uses como indicador de que el thread
debe morir. De otra forma está mal.
4. En todo caso sería más claro si el stop() llama al stop de pthread y
dejás que la forma de indicar la finalización del thread esté a cargo de la
clase derivada de Thread. Esto sería mucho mejor ya que hasta ese momento no
sabés que implica un pedido de finalización del thread. No sabés qué es lo
que hace ese thread.
Saludos...
On 10/15/07, John Knight <[EMAIL PROTECTED]> wrote:
>
> buenas de nuevo...
> toy teniendo un problema con una aplicacion q usa pthread
> tengo una aplicacion con muchos hilos, con un hilo que se ocupa solo de
> fijarse si el usuario teclea una X para abortar el programa
> (estoy encapsulando pthread en una clase Thread)
> el codigo que ejecuta el hilo ThreadConsola seria el siguiente:
>
> while (!_mustStop) {
> if (toupper(getchar()) == 'X') {
> _mustStop = true;
> _cerrar = true;
> std::cout << "Cerrar xq toco X" << std::endl;
> }
> }
>
> _mustStop es una variablede la clase Thread que solo encapsula pthread,
> usada para poder realizar un stop() desde afuera
> _cerrar es atributo de ThreadConsola para marcar si se aborto el programa
>
>
> desde el main hago lo siguiente:
>
> ThreadConsola thConsola;
> if (thConsola) {
> thConsola.run(); //LINEA 28 de client_main.cpp
> while (!thConsola.getCerrar()) {
> }
> thConsola.stop();
> thConsola.join();
>
> el run() llama el pthread_create
> el join() llama pthread_join
>
> cuando lo corro con valgrind el programa termina pero me tira el siguiente
> error
> 72 bytes in 1 blocks are possibly lost in loss record 2 of 2
> ==30428== at 0x401C6CA: calloc (vg_replace_malloc.c:279)
> ==30428== by 0x400E188: (within /lib/ld-2.3.6.so)
> ==30428== by 0x400E24B: _dl_allocate_tls (in /lib/ld-2.3.6.so)
> ==30428== by 0x414881F: pthread_create@@GLIBC_2.1 (in
> /lib/tls/i686/cmov/libpthread-2.3.6.so)
> ==30428== by 0x804ABC2: Thread::run() (common_thread.cpp:23)
> ==30428== by 0x8049293: ImprimirSimulacion(std::string const&, unsigned
> short const&) (client_main.cpp:28)
> ==30428== by 0x80494B0: main (client_main.cpp:49)
>
> o sea, se queja de q no libero memoria al hacer el pthread_create() dentro
> de thConsola.run();
>
> la verdad q recien empiezo con el tema threads, por lo q no la tengo
> clara...
> no se si estoy haciendo las cosas bien
> lo que me trae dudas es que hace el join en este caso, xq el getchar es
> "blockeante"
> espero q el codigo sea suficiente para saber el origen del problema
> gracias adelantadas
> saludos
>
> _______________________________________________
> Lista de correo Programacion.
> [email protected]
> http://listas.fi.uba.ar/mailman/listinfo/programacion
>
>
--
_Leo_
(aka Lele)
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion