homer512

rwlock deadlock

Jan 1st, 2026
4,153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.97 KB | None | 0 0
  1. from contextlib import contextmanager
  2. from threading import Condition, Thread
  3. import time
  4.  
  5. class SharedLock:
  6.     def __init__(self):
  7.         self._cond = Condition()
  8.         self._readers = 0
  9.  
  10.     @contextmanager
  11.     def __call__(self, lock_type: str):
  12.         if lock_type == 'shared':
  13.             with self._cond:
  14.                 self._readers += 1
  15.             yield self
  16.             with self._cond:
  17.                 self._readers -= 1
  18.                 if not self._readers:
  19.                     self._cond.notify()
  20.         elif lock_type == 'exclusive':
  21.             with self._cond:
  22.                 while self._readers:
  23.                     self._cond.wait()
  24.                 yield self
  25.         else:
  26.             raise ValueError(f'Invalid lock_type {lock_type!r}')
  27.  
  28. if __name__ == '__main__':
  29.     shared_lock = SharedLock()
  30.  
  31.     def reader():
  32.         with shared_lock('shared'):
  33.             print('start reading', time.time())
  34.             time.sleep(1)
  35.             print('end reading', time.time())
  36.  
  37.         # Give writer thread a chance to acquire exclusive use:
  38.         #time.sleep(.1)
  39.  
  40.         #with shared_lock('shared'):
  41.         #    print('start reading', time.time())
  42.         #    time.sleep(1)
  43.         #    print('end reading', time.time())
  44.  
  45.     def writer():
  46.         # Give reader threads a chance to acquire shared use:
  47.         time.sleep(.1)
  48.  
  49.         with shared_lock('exclusive'):
  50.             print('start writing', time.time())
  51.             time.sleep(1)
  52.             print('end writing', time.time())
  53.  
  54.     def test():
  55.         reader_threads = [
  56.             Thread(target=reader) for _ in range(1)
  57.         ]
  58.  
  59.         writer_threads = [
  60.             Thread(target=writer) for _ in range(2)
  61.         ]
  62.  
  63.         for t in reader_threads:
  64.             t.start()
  65.         for t in writer_threads:
  66.             t.start()
  67.  
  68.         for t in reader_threads:
  69.             t.join()
  70.         for t in writer_threads:
  71.             t.join()
  72.  
  73.     test()
  74.  
Advertisement