Producer and Consumer – Semaphore Example

 

program prod_cons_sem;

   var   in, out: integer;

          buf: array[0..n-1] of integer;

          empty, full, mutex: semaphore;

 

   procedure append(x: integer);                    procedure remove(var y: integer);

       begin                                                          begin

          WAIT(full);                                                 WAIT(mutex);

          WAIT(mutex);                                             WAIT(empty);

          buf[in] := x;                                               y := buff[out];

          in := (in + 1)mod n;                                    out := (out + 1)mod n;

          SIGNAL(mutex);                                          SIGNAL(full);

          SIGNAL(empty);                                          SIGNAL(mutex);

       end;                                                           end;

  

   procedure producer;                                  procedure consumer;

       var item: integer;                                         var item: integer;

       while true do                                               while true do

          begin                                                          begin

              generate item;                                             remove(item);

              append(item);                                             use item;

          end;                                                           end;

 

begin {main program executable code}

   in := 0; out := 0; full := n; empty := 0, mutex := 1;

   cobegin

       producer;

       consumer;

   coend;

end.