Programa Incognita con monitores: Incremento concurrente de una variable global.

NOTA: El compilador de Pascal-FC no acepta funciones dentro de monitores. En los ejemplos se ve como evitar su uso mediante procedures.

Usando pasaje de parametros por referencia (procedure valor).

program Incognita;

monitor incremento;
	export inc, valor;
	var i:integer;

	procedure inc;
	 begin
		i:=i+1;
	end;

	procedure valor(var val: integer);
	begin
	  val:=i;
	end;
begin
	i:=0;
end;

process P1;
	var i, x: integer;
begin
	for i:=1 to 5 do
	begin
		incremento.inc;
		incremento.valor(x);
		writeln(x);
	end;
end;

process P2;
	var i, x: integer;
begin
	for i:=1 to 5 do
	begin
		incremento.inc;
		incremento.valor(x);
		writeln(x);
	end;
end;

begin
	cobegin
		P1;
		P2;
	coend;
end.

Evitando el retorno del valor incrementado (procedure print).

program Incognita;

monitor incremento;
	export inc, print;
	var i:integer;

	procedure inc;
	 begin
		i:=i+1;
	end;

	procedure print;
	begin
	  writeln(i)
	end;
begin
	i:=0;
end;

process P1;
	var i: integer;
begin
	for i:=1 to 5 do
	begin
		incremento.inc;
		incremento.print;
	end;
end;

process P2;
	var j: integer;
begin
	for j:=1 to 5 do
	begin
		incremento.inc;
		incremento.print;
	end;
end;

begin
	cobegin
		P1;
		P2;
	coend;
end.

Programa erróneo sin mecanismos de control de concurrencia.

program Incognita;
	var x: integer;

process P1;
	var i: integer;
begin
	for i:=1 to 5 do
	begin
		x:=x+1;
		writeln('P1: x=',x);
	end;
end;

process P2;
	var j: integer;
begin
	for j:=1 to 5 do
	begin
		x:=x+1;
		writeln('P2: x=',x);
	end;
end;

begin
	x:=0;
	writeln('INI x=',x);
	cobegin
		P1;
		P2;
	coend;
	writeln('FIN x=',x);
end.


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