Rozwiązanie przedstawione poniżej przetwarza wiele żądań jednocześnie, i jednocześnie nie posiada mankamentu poprzedniego rozwiązania.
process Czytelnia var: k: komunikat_typ; ilu_czytelnikow, ilu_czytelnikow_czyta: integer; ilu_pisarzy, ilu_pisarzy_pisze: integer; i: integer; begin while (true) do begin k := GetMessage(operacje); case k of ChceCzytelnik: ilu_czytelnikow := ilu_czytelnikow + 1; if (ilu_pisarzy=0) then begin ilu_czytelnikow_czyta := ilu_czytelnikow_czyta + 1; SendMessage(moze_czytelnik, MozeCzytelnik); end; ChcePisarz: ilu_pisarzy := ilu_pisarzy + 1; if (ilu_czytelnikow=0 and ilu_pisarzy_pisze=0) then begin ilu_pisarzy_pisze := ilu_pisarzy_pisze + 1; SendMessage(moze_pisarz, MozePisarz); end; ZwalniaCzytelnik: ilu_czytelnikow_czyta := ilu_czytelnikow_czyta - 1; ilu_czytelnikow := ilu_czytelnikow - 1; if (ilu_czytelnikow_czyta=0) then begin if (ilu_pisarzy>0) then begin ilu_pisarzy_pisze++; SendMessage(moze_pisarz, MozePisarz); end; end; ZwalniaPisarz: ilu_pisarzy_pisze := ilu_pisarzy_pisze - 1; ilu_pisarzy := ilu_pisarzy - 1; if (ilu_czytelnikow>0) then begin for i:=1 to ilu_czytelnikow do begin ilu_czytelnikow_czyta := ilu_czytelnikow_czyta + 1; SendMessage(moze_czytelnik, MozeCzytelnik); end; end; else if (ilu_pisarzy>0) then begin ilu_pisarzy_pisze := ilu_pisarzy_pisze + 1; SendMessage(moze_pisarz, MozePisarz); end; end; {case} end; end;