Problema del productor-consumidor usando monitores

Este programa es una version mejorada del de la página 181 del libro Programación Concurrente (Palma et.al) que no compilaba. Este compila y ejecuta bien. Se ha cambiado el orden del export que daba error. Se ha sustituído la funcion extraer por un procedure con paso de parametro variable por referencia.

NOTA: El compilador de Pascal-FC no acepta funciones dentro de monitores.


program PCMON; (* productor-consumidor usando monitor *)

monitor buffer;
export insertar, extraer;
const BUFFMAX = 10;
var
  tam, frente, cola: integer;
  nolleno, novacio: condition;
  recurso: array[0..BUFFMAX] of char;

procedure insertar(elemento: char);
begin
  if tam > BUFFMAX then delay(nolleno); (* bloquearse si no hay espacio.*)
  recurso[cola] := elemento;
  cola := (cola + 1) mod (BUFFMAX + 1);
  tam := tam + 1;
  resume(novacio) (*desbloquear al consumidor.*)
end;  (* insertar *)


procedure extraer(var elemento: char);
begin
  if tam = 0 then delay(novacio); (* bloquearse sí no hay elementos.*)
  elemento := recurso[frente];
  frente := (frente + 1) mod (BUFFMAX + 1);
  tam := tam - 1;
  resume(nolleno) (* desbloquear a un productor. *)
end;  (* extraer *)

begin  (* body of buffer *)
  frente := 0;
  cola := 0;
  tam := 0
end;  (* buffer *)


process productor;
var
  LOCAL: char;
begin
  for LOCAL := 'a' to 'z' do
    buffer.insertar(LOCAL);
end;  (* productor *)


process consumidor;
var
  CH: char;
begin
  repeat
    buffer.extraer(CH);
    write(CH)
  until CH = 'z';
  writeln
end;  (* consumidor *)

begin  (* main *)
  cobegin
    productor;
    consumidor
  coend
end.


Última actualización: 6 de mayo de 2004
abia@dlsi.ua.es