Synchronizacja dostępu

Uruchamiamy współbieżnie dwa następujące procesy.

var:
	p: integer := 0;

process Generator;
begin
  while (true) do
  begin
    generator_protokol_wstepny;
    p = generuj_nastepny(p);
    generator_protokol_koncowy;
  end;
end;

process Drukarz;
begin
  while (true) do
  begin
    drukarz_protokol_wstepny;
    drukuj(p);
    drukarz_protokol_koncowy;
  end;
end;

Pierwszy program generuje wartości, drugi program drukuje wartości. Chcemy zapewnić, że każda wartość wygenerowana przez pierwszy program zostanie wydrukowana przez drugi program dokładnie jeden raz. Jakie instrukcje należy umieścić w protokołach, aby zrealizować ten cel?