import threading class ReadWriteLock: def __init__(self): self._rw_lock = threading.Lock() self._readers = 0 self._writers_waiting = 0 self._writer = False self._cond = threading.Condition(self._rw_lock) def acquire_read(self): with self._cond: # 如果已有写锁,或有写者在等待,都要等 while self._writer or self._writers_waiting > 0: self._cond.wait() self._readers += 1 def release_read(self): with self._cond: self._readers -= 1 if self._readers == 0: self._cond.notify_all() def acquire_write(self): with self._cond: self._writers_waiting += 1 # 等到没人读、没人写 while self._writer or self._readers > 0: self._cond.wait() self._writers_waiting -= 1 self._writer = True def release_write(self): with self._cond: self._writer = False self._cond.notify_all()