martes, 26 de julio de 2016

Separar un thread, hb_threadDetach()


hb_threadDetach


hb_threadDetach( <pThID> ) -> <lOK>

¿Qué debo hacer cuando mi hilo no devuelve nada útil, y no tiene que esperar a su finalización?

hb_threadDetach indica al sistema: Estoy empezando este hilo, pero no estoy interesado en unirse a él. Esta operación se denomina separar un thread.

Las reglas más importantes para unirse( hb_threadJoin)  / separarse( hb_threadDetach  ) son:
  • No se una a un thread que ya se ha unido
  • No puede unirse a un thread separado.
  • Si extrae un thread , no se puede "volver a conectarse" al mismo.

De todas maneras, no sé exactamente cuál es el propósito del detach en Harbour si llamando  a hb_threadStart() realiza la misma función, sin usar Join, al menos, en las pruebas
que he realizado no logro ver diferencias entre crear un hilo, y crear un hilo y dejarlo morir  y llamar a detach. ( Si alguien lo sabe, bienvenida explicación )

Un ejemplo, seria poner un reloj o ejecutar un sonido ante un evento, sin importar el resultado.

Ahora bien, hay que tener en cuento que los threads pueden no terminar, porque el proceso principal ha terminado, matando los threads pendientes.

En el siguiente código, su ejecución va a provocar la creación de un fichero o no, pero ojo,
puede ser que el contenido esté o no.

Esto se debe al separar el hilo con hb_threadDetach, el terminar el proceso principal, hace
que el hilo también se acabe, sin terminar su tarea.

El objetivo del ejemplo es mostrar que hace hb_threadDetach, lógicamente, el ejemplo no tiene sentido.


#include "hbthread.ch"

proc main()
  cls
 
  s_p1 := s_p2 := s_p3 := 0
  ? "Llama"
 hb_threadDetach(  hb_threadStart( @p1(), "sin nada" ) )

  ? "Salimos"
    
return

proc p1( ctext )
  Local h

   h := fcreate("test.txt")
   fwrite( h, ctext)
   fclose( h )

return


Entonces, ¿ cómo podemos evitar esta situación ?

Siguiente: hb_threadWaitForAll()

No hay comentarios:

Publicar un comentario

Android y Git. Disponer del hash automáticamente.

Una de las cosas a las que estoy acostumbrado, es tener siempre en mi código, el hash/tag/versión del control de versiones que estoy usan...