clarisimo muchas gracias
el problema era de la liberacion de la memoria, nada mas... funciona todo bien
sin tener en cuenta el error de valgrind
1) el programa lanza mas threads... el codigo esta resumido
2) el thread se termina cuando se apreta una 'X'... el ciclo verifica que
_mustStop este en falso
si desde afuera se hace stop() de Thread se setea en true el _mustStop... y el
thread termina
3) el stop() justamente cambia el bool, nada mas. quedaria en las clases hijas
controlar que se termine cuanto antes si se prende el flag para parar
4) el stop para pthreads que te referis es el kill?
agregando una duda...
cuando hago
thConsola.run(); //LINEA 28 de client_main.cpp
while (!thConsola.getCerrar()) {
}
deberia tener un sleep(1) adentrodel while para que no consuma tanta CPU?
grax de nuevo por la info :D
saludos
----- Original Message -----
From: Leandro Fernández
To: Una lista para consultas de programación
Sent: Monday, October 15, 2007 10:59 AM
Subject: Re: [Prog] problema con pthread
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
------------------------------------------------------------------------------
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.488 / Virus Database: 269.14.11/1071 - Release Date: 15/10/2007
06:48 a.m.
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion