{ Single producer consumer bounded buffer }
{ buffer has N slots }

var
  InE, OutE: TEventCount; { Set up and initially 0 }

{ producer }

var
  I: integer;

begin
  while not terminated do
  begin
    OutE.Await(I - N);
    { insert item at I mod N }
    InE.Advance;
    Inc(I);
  end;
end;

{ consumer }

var
  I: integer;

begin
  while not terminated do
  begin
    InE.Await(I);
    { remove item at i mod N }
    OutE.Advance;
  end;
end;