读写锁只有一个基础锁?


问题内容

我已经使用Python的并发原语编写了读写锁(我认为!)。我在SO或其他地方阅读的每个实现似乎都使用2个锁-
一个用于读取,另一个用于写入。我的实现只包含一个用于读取的监视器,但是我可能缺少一些重要的内容-
任何人都可以确认它可以工作吗?如果是这样,使用额外的写锁有什么好处?

这是经典的读写锁,偏爱读者(可能会饿死作家)。我使用虚拟缓存来演示读取和写入。

    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

问题答案:

您没有使用单个锁。
您正在使用 锁和条件变量

self.read_lock = t.Condition(t.Lock())

条件变量也是并发原语。比锁更复杂的一个。

注意: 请不要调用条件变量对象read_lock

编辑: 您的代码对我来说似乎是正确的,因为它解决了“
第一读者—作家”的问题

。正如您所说,这可能会饿死作家。这不是一个小问题。读者写作者背后的逻辑是,读可能比写更多
。额外的锁可以解决 第二个读者-作家问题 ,即作家不会挨饿。确实,当有作家在等待资源时,读者必须等待。