Lock
Los cerrojos simples son uno de los mecanismos de sincronización que ofrece el módulo threading. Un cerrojo dispone de los métodos acquire (para bloquear el cerrojo) y release (para desbloquear el cerrojo).
Cuando un hilo llama a acquire por primera vez, bloquea el cerrojo de forma que el próximo hilo que llame a acquire quedará esperando hasta que el cerrojo se desbloquee. Llamando a la función release el cerrojo se desbloqueará y el hilo que esté en espera podrá continuar.
Ejemplo:
lock.acquire() # El hilo queda esperando si el cerrojo ha sido bloqueado
# Acceso a recurso compartido
lock.release()
RLock (Re-entrant Lock)
Un cerrojo reentrante funciona de forma similar a un cerrojo simple, pero en este caso un mismo hilo puede llamar a acquire varias veces sin quedar esperando.
Cuando un hilo bloquea un cerrojo, este hilo puede volver a llamar a acquire tantas veces como quiera sin que quede esperando, esto se debe a que esta implementación de cerrojos tiene en cuenta al hilo que ha bloqueado el cerrojo e impide que éste pueda quedar esperando tras un cerrojo que él mismo ha bloqueado.
Si otro hilo distinto al que ha bloqueado el cerrojo intenta llamar a acquire, quedará esperando hasta que el hilo correspondiente lo libere llamando a release.
Para liberar el cerrojo, se deberá llamar a release tantas veces como se haya llamado a acquire.
Ejemplo:
lock = threading.RLock()
lock.acquire()
lock.acquire() # El hilo no quedará esperando
lock.release()
lock.release()
Fuentes:
No hay comentarios:
Publicar un comentario