Schreib- / Lesesperre mit nur einer zugrunde liegenden Sperre?
Ich habe eine Lese- / Schreibsperre mit Pythons Parallelitätsprimitiven geschrieben (glaube ich!). Jede Implementierung, die ich auf SO oder anderswo gelesen habe, scheint zwei Sperren zu verwenden - eine für Lesevorgänge und eine für Schreibvorgänge. Meine Implementierung enthält nur einen Monitor zum Lesen, aber mir fehlt möglicherweise etwas Entscheidendes - kann jemand bestätigen, dass dies funktioniert? Wenn ja, welchen Vorteil bietet die Verwendung einer zusätzlichen Schreibsperre?
Dies ist die klassische Schreib- / Lesesperre mit Vorliebe für Leser (kann Autoren hungern lassen). Ich verwende einen Dummy-Cache, um das Lesen und Schreiben zu demonstrieren.
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