###### 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
```