domingo, 27 de noviembre de 2011

Primitivas de sincronización mediante cerrojos: Lock y RLock

Dentro del módulo threading, disponemos de las primitivas de sincronización de hilos mediante cerrojos: Lock y RLock.

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 = threading.Lock()

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