Producer and Consumer – Monitor Example

 

program prod_cons_mon;

   monitor buffer;

       var   count, in, out: integer;

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

              full, empty: condition;

 

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

          begin                                                      begin

              if count > n then WAIT(full);                      if count = 0 then WAIT(empty);

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

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

              count := count + 1;                                  count := count – 1;

              SIGNAL(empty);                                       SIGNAL(full);

          end;                                                       end;

 

   begin {monitor executable code}

       count := 0;

       in := 0;

       out := 0;

   end;

 

   procedure producer;                               procedure consumer;

       var item: integer;                                     var item: integer;

          while true do                                            while true do

              begin                                                      begin

                 generate item;                                          buffer.remove(item);

                 buffer.append(item);                                 use item;

              end;                                                       end;

 

begin {main program}

   cobegin

       producer;

       consumer;

   coend;

end.