{ Bounded buffer with multiple producers and consumers }
var
InE, OutE: TEventCount; { Set up and initially 0 }
PrTk, CnTk: TSequencer; { Set up and initially 0 }
{ producer }
var
MyTurn: integer;
begin
while not terminated do
begin
MyTurn := PrTk.Ticket;
InE.Await(MyTurn);
OutE.Await(MyTurn - N + 1);
{ insert item at myturn mod N }
InE.Advance;
end;
end;
{ consumer }
var
MyTurn: integer;
begin
while not terminated do
begin
MyTurn := CnTk.Ticket;
OutE.Await(MyTurn);
InE.Await(MyTurn + 1);
{ remove item at MyTurn mod N }
OutE.Advance;
end;
end;