jueves, 28 de julio de 2016

Mutex.


MUTEX
¿ Que es un mutex ?
En un proceso concurrente, el acceso a compartir datos puede llegar a crear inconsistencia de datos. Para evitarlo usaremos unos mecanismos que nos va a permitir modificar datos de manera consistente. Ver Exclusión Mutua


hb_mutexCreate() -> <pMtx>
Crea un mutex , que podemos usarlo como semáforo o para suscripción de mensajes.
De momento, vamos a usarlo como semáforo, que por cierto, desde aquí un tributo a quién lo inventó,  Edsger Dijkstra en 1965!!! Semáforo ( Informática )
Lo que nos devuelve es un puntero que usaremos posteriormente.

hb_mutexLock( <pMtx> [, <nTimeOut> ] ) -> <lLocked>
Simplemente lo que haces al llamar a hb_mutexLock() es establecer un bloqueo en el Thread. Si el mutex se encuentra bloqueado por otro thread, el thread actual queda a la espera de que se termine el bloqueo, así, cuando el Mutex vuelva a estar disponible,
solo unos de los threads obtendrá acceso, mientras que los demás threads seguirán esperando.  nTimeOut, indica la cantidad de segundos que estaremos esperando para conseguir el bloqueo, por defecto , lo intentará indefinidamente.

hb_mutexUnlock( <pMtx> ) -> <lOK>
Desbloquea Mutex y lo deja para que otro thread lo pueda bloquear.

#include "hbthread.ch"
STATIC s_hMutex
proc main()
  cls
  s_hMutex   := hb_mutexCreate()
 
  hb_threadStart( @EscribeLog(), "Thread A" )
  hb_threadStart( @EscribeLog(), "Thread B" )
  hb_threadStart( @EscribeLog(), "Thread C" )
  hb_threadStart( @EscribeLog(), "Thread D" )
  ? "Salimos"
  hb_threadWaitForAll()
 
return

proc EscribeLog( cText )
  static n := 0
 /* El que bloquea, escribe e incrementa n */
 if hb_mutexLock( s_hMutex )
    ? cText , ++n
   hb_mutexUnLock( s_hMutex )
 endif          

return
Hay que tener especial cuidado que es lo que bloqueamos. Por ejemplo, realizar esto;;

if bb_mutexLock( s_hMutex )
  Funcion_que_tarda_un_monton()
  hb_mutexUnLock( s_hMutex )
endif

Toda la magia de los threads se pierde. Es como si al querer modificar un registro de una tabla, bloqueamos TODA LA TABLA, ¿ Verdad que no tiene sentido ?

Hay que ser cuidadoso, pero como podéis ver, tampoco es tan tan complicado.


Siguiente:Subscribe & Notify

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...