0

Ich programmiere Nebenläufigkeit in Pascal-FC mit Eclipse Gavab 2.0. Ich habe bisher keine Probleme damit gehabt, es zu benutzen, da es mich immer darüber informiert, welche Fehler es gibt, wenn es ein Programm nicht ausführen kann. Ich habe das Producer-Consumer-Problem mit Semaphoren gemacht und es hat gut funktioniert. Jetzt habe ich es mit einem Monitor gemacht, aber wenn ich es starte, startet es für eine Sekunde, stoppt dann und tut nichts anderes. Es zeigt überhaupt keine Fehler, und ich kann nichts falsch mit dem Code finden. Ist es ein Problem des Compilers?Warum möchte Pascal FC diesen Code nicht mit Monitoren ausführen?

Erzeuger-Verbraucher mit Semaphore:

program ProdCons; 
const MAXDATOS = 10; 

{ Creamos el buffer de comunicación: } 
type tBuffer = record 
    datos : array [1..MAXDATOS] of integer; 
    posInser, posSacar : integer; 
    nProductos, nHuecos, em : semaphore; 
end; 

var buffer : tBuffer; 


{ METODOS O PROCEDIMIENTOS: } 
procedure inicializar(var buffer : tBuffer); 
begin 
    buffer.posInser := 1; 
    buffer.posSacar := 1; 
    initial(buffer.nProductos,0); 
    initial(buffer.nHuecos,MAXDATOS); 
    initial(buffer.em,1); 
end; 

procedure insertar(dato : integer; var buffer : tBuffer); 
begin 
    wait(buffer.nHuecos); {En num de huecos debe ser >0} 

    wait(buffer.em); 
    buffer.datos[buffer.posInser] := dato; 
    writeln('Inserta dato ',dato,' en datos[',buffer.posInser,']'); 
    buffer.posInser := buffer.posInser MOD MAXDATOS + 1; 
    signal(buffer.em); 

    signal(buffer.nProductos); {Confirmamos que num. productos >0} 
end; 

procedure sacar(dato : integer; var buffer : tBuffer); 
begin 
    wait(buffer.nProductos); {Esperamos a que num. productos >0} 

    wait(buffer.em); 
    dato:=buffer.datos[buffer.posSacar]; 
    writeln('Consume dato ',dato,' en datos[',buffer.posSacar,']'); 
    buffer.posSacar := buffer.posSacar MOD MAXDATOS + 1; 
    signal(buffer.em); 

    signal(buffer.nHuecos); 
end; 

{ PROCESOS TIPO: } 
process type tProductor(var buffer : tBuffer); 
var dato : integer; 
begin 
    repeat 
     dato := random(200); 
     insertar(dato,buffer); 
    forever 
end; 

process type tConsumidor(var buffer : tBuffer); 
var dato : integer; 
begin 
    repeat 
     sacar(dato,buffer); 
    forever 
end; 



{ Variables: } 
var i : integer; 
    prod : array [1..5] of tProductor; 
    cons : array [1..3] of tConsumidor; 

begin 
    inicializar(buffer); 
    cobegin 
     for i:=1 to 5 do 
      prod[i](buffer); 

     for i:=1 to 3 do 
      cons[i](buffer); 
    coend; 
end. 

Producer-Consumer with semaphore's output

Producer-Consumer mit einem Monitor:

program ProdConsMONITORES; 
const N = 5; 

monitor ProdCons; 

export produce, consume; 

{Variables} 
var posProd, posCons, cont : integer; 
    obj : array [1..N] of integer; 
    vacio, lleno : condition; 


{Procedimientos/metodos} 
procedure produce(dato,i : integer); 
begin 
    if cont=N then delay(lleno); 
    obj[posProd] := dato; 
    writeln('Productor',i,' produce dato ',dato,' en obj[',posProd,']'); 
    posProd := posProd MOD N + 1; 
    cont := cont + 1; 
    writeln('  [',cont,' objetos disponibles]'); 
    resume(vacio); 
end; 

procedure consume(j : integer); 
var dato := integer; 
begin 
    if cont=0 then delay(vacio); 
    dato := obj[posCons]; 
    writeln('Consumidor',j,' consume dato ',dato,' en obj[',posCons,']'); 
    posCons := posCons MOD N + 1; 
    cont := cont - 1; 
    writeln('  [',cont,' objetos disponibles]'); 
    resume(lleno); 
end; 

{Procesos} 
process type Productor(i : integer); 
var dato : integer; 
begin 
    dato := random(10); 
    ProdCons.produce(dato,i); 
end; 

process type Consumidor(j : integer); 
begin 
    ProdCons.consume(j); 
end; 

{Variables locales} 
var p : array [1..5] of Productor; 
var c : array [1..3] of Consumidor; 
var i,j : integer; 

begin 
cont := 0; 
posProd := 1; posCons := 1; 
cobegin 
    writeln('hola'); 
    for i:=1 to 5 do 
     p[i](i); 
    for j:=1 to 3 do 
     c[j](j); 
coend; 
end. 

Producer-Consumer with monitor's output

Antwort

0

Nur falls jemand anderes hat dieses Problem: Der Fehler war, dass ich den Körper nicht erstellt habe des Monitors, der ein "Begin-End" ist, wo Variablen initialisiert werden. Es muss direkt nach dem Verfahren und geht so gesetzt werden:

begin 
    cont := 0; 
    posProd := 1; posCons := 1; 
end; 

Offensichtlich ist es nicht mehr necesary Vars zu initialisieren. am letzten Beginn.

Verwandte Themen