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