Grupowanie uczestników

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;