###### tags: `prir` `studia` # Problem czytelników i pisarzy Podział ról **Czytelnicy** - czytają rekordy bazy - dowolna ilość czytelników może czytać na raz - w trakcie ich czytania do bazy nie może mieć dostępu żaden pisarz **Pisarze** - tworzą, odczytują, modyfikują i usuwają dane z bazy - tylko jeden pisarz w danym momencie może mieć dostęp do bazy (**wyłączny dostęp**) **Czytelnik -> wyklucza pisarzy Pisarz -> wyklucza wszystkich** ## Rozwiązanie z możliwym zagłodzeniem pisarzy ``` Semaphore dostep = (1, {}) -> CZYTELNIK Semaphore s = (1, {}) int czytelnikow = 0 loop forever { wait(s) ++czytelnikow if (czytelnikow == 1) wait(dostep) signal(s) // odczytaj dane z bazy wait(s) --czytelnikow if (czytelnikow == 0) signal(dostep) signal(s) } -> PISARZ loop forever { wait(dostep) // zapisz dane do bazy signal(dostep) } ``` **Zagłodzenie** pojawi się, gdy czytelnicy ciągle będą się zgłaszać do bazy, wtedy ich liczba nie spadnie do 0 i pisarze nigdy nie dostaną dostępu do bazy. ## Rozwiązanie sprawiedliwe - czytelnicy i pisarze na przemian dostają dostep ``` ...długie ```