OK, zaimplementowałem sobie rozwiązanie, gdzie czytelnicy są preferowani, a pisarze mogą być zagłodzeni (i to działa, pisarze czasami dostają dostęp, ale czytelnicy są "górą"). Następnie próbowałem zaimplementować sytuację odwrotną, czyli gdzie pisarze są preferowani, a czytelnicy mogą być zagłodzeni i tu mam problem. Kod wygląda tak:
def writer(self):
while True:
logging.info('Writer starts to write...')
sem_wrt.acquire()
self.wrt_count += 1
if self.wrt_count == 1:
sem_rdr_try.acquire()
sem_wrt.release()
sem_book.acquire()
logging.info('Writing...')
time.sleep(randint(1,3))
logging.info('Writing finished...')
sem_book.release()
sem_wrt.acquire()
self.wrt_count -= 1
if self.wrt_count == 0:
sem_rdr_try.release()
sem_wrt.release()
Po uruchomieniu okazuje się, że czytelnicy tylko raz czytają, a następnie gdy próbują znowu dostać się do zasobu, to nie jest to możliwe (czekam kilkanaście minut obserwując to co się dzieje i żaden czytelnik nie pojawia się niestety). Testy robiłem puszczając dwa wątki pisarzy i dwa czytelników, taka konfiguracja sprawdzała się w przypadku sytuacji odwrotnej, czyli gdzie czytelnicy są preferowani. Co może być nie tak?