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

Responder a