Pracownicy grupują się w zespoły czteroosobowe. Grupowanie prowadzi do ustalenia składu grupy pracownika. W rezultacie poznaje on identyfikatory innych członków zespołu. Po ustaleniu zespołu pracownik przystępuje do pracy zespołowej.
const
LICZBA_PRACOWNIKOW = ...;
process Pracownik(i: integer)
var
zespol: array[1..4] of integer;
begin
while (true) do
begin
... { | }
zespol := ... { | GRUPOWANIE }
... { | }
PRACA_ZESPOLOWA(zespol);
end;
end;
var
i: integer;
begin
cobegin
for i:=1 to LICZBA_PRACOWNIKOW do
begin
Pracownik(i);
end;
coend;
end;
W rozwiązaniu wykorzystana zostaje metoda Przekazywania (Dziedziczenia) Sekcji Krytycznej.
var
czworka: array[1..4] of integer;
liczba_pracownikow: integer := 0;
czekajacy_na_komplet: binary semaphore := 0;
ochrona: binary semaphore := 1;
process Pracownik(i: integer)
var
zespol: array[1..4] of integer;
begin
while (true) do
begin
P(ochrona);
liczba_pracownikow := liczba_pracownikow + 1;
czworka[liczba_pracownikow] = i;
if (liczba_pracownikow<4) then
P(czekajacy_na_komplet);
zespol := czworka;
liczba_pracownikow := liczba_pracownikow - 1;
if (liczba_pracownikow>0)
V(czekajacy_na_komplet);
else
V(ochrona);
PRACA_ZESPOLOWA(zespol);
end;
end;