Bloqueio de leitura e gravação com apenas um bloqueio subjacente?
Eu escrevi um bloqueio de leitura e gravação usando as primitivas de simultaneidade do Python (eu acho!). Toda implementação que eu li no SO ou em outro lugar parece usar 2 bloqueios - um para leituras e outro para gravações. Minha implementação contém apenas um monitor para leituras, mas posso estar perdendo algo crucial - alguém pode confirmar que isso funcionará? Em caso afirmativo, qual é o benefício de usar um bloqueio de gravação adicional?
Esse é o bloqueio clássico de leitura e gravação, com preferência pelos leitores (pode passar fome aos escritores). Eu uso um cache fictício para demonstrar a leitura e gravação.
import threading as t
class ReadWriteCache(object):
def __init__(self):
self.cache = {}
self.reads = 0
self.read_cond = t.Condition(t.Lock())
def read(self, key):
with ,self.read_cond: # Register the read, so writes will wait()
self.reads += 1
result = self.cache[key]
with self.read_cond:
self.reads -= 1
if not self.reads:
self.read_cond.notify_all()
return result
def update(self, key, value):
with self.read_cond:
while self.reads:
self.read_cond.wait() # Wait for reads to clear
self.cache[key] = value # With read lock, update value