Dodatkowe założenie: maksymalnie N zadań może być przetwarzanych jednocześnie.
Zauważmy, że w przypadku wielu pracowników przetwarzanie wewnątrz monitora prowadzi do ograniczenia wydajności. W monitorze może przebywać tylko jeden proces. Oznacza to, że zadania w tym przypadku będą przetwarzane pojedynczo. Z tego powodu rozwiązanie, w którym przetwarzanie odbywa się na zewnątrz monitora jest korzystniejsze.
type status_t = (wolne, oczekujace, przetwarzane, gotowe); praca_t = record begin m_zadanie: zadanie_t; m_rezultat: rezultat_t; m_status: status_t; m_czekanie: condition; end; var prace: array [1..N] of praca_t = { N times { .m_status = wolne } }; liczba_przetwarzanych_zadan: integer := 0; klienci: condition; pracownicy: condition; procedure znajdz_miejsce(in status_t: p_status, out lokalizacja: 1..N, in ostatnio_uzywane: integer) var i: integer; begin for i:=ostatnio_uzywane+1 to N do begin if (prace[i].m_status=p_status) lokalizacja := i; return; end; for i:=1 to ostatnio_uzywane do begin if (prace[i].m_status=p_status) lokalizacja := i; return; end; lokalizacja := 0; return; end; export procedure zlecenie_przetwarzania(in p_zadanie: zadanie_t, out p_rezultat: rezultat_t) var: lokalizacja: 1..N; praca_t: praca; begin if (liczba_przetwarzanych_zadan=N) then wait(klienci); liczba_przetwarzanych_zadan++; znajdz_miejsce(wolne, lokalizacja, N); praca := prace[lokalizacja]; praca.m_zadanie := p_zadanie; praca.m_status := oczekujace; signal(pracownicy); wait(praca.m_czekanie); p_rezultat := praca.m_rezultat; praca.m_status := wolne; liczba_przetwarzanych_zadan--; signal(klienci); end; export procedure pobieranie_zadania(out lokalizacja_rezultatu: 1..N, out p_zadanie: zadanie_t) var begin znajdz_miejsce(oczekujace, lokalizacja_rezultatu, lokalizacja_rezultatu); if (lokalizacja_rezultatu=0) then begin wait(pracownicy); znajdz_miejsce(oczekujace, lokalizacja_rezultatu, lokalizacja_rezultatu); end; praca := prace[lokalizacja_rezultatu]; p_zadanie := praca.m_zadanie; praca.m_status := przetwarzane; end; export procedure umieszczanie_rezultatu(in lokalizacja_rezultatu: 1..N, in p_rezultat: rezultat_t) begin praca := prace[lokalizacja_rezultatu]; praca.m_rezultat := p_rezultat; praca.m_status := gotowe; signal(praca.m_czekanie); end;