0

Eclipse Gavab 2.0을 사용하여 Pascal-FC에서 동시성을 프로그래밍하고 있습니다. 나는 프로그램을 실행할 수 없을 때 어떤 오류가 있는지 알려주므로 어떤 문제도 발생하지 않았습니다. 세마포어를 사용하여 생산자 - 소비자 문제를 만들었지 만 문제가되지 않았습니다. 이제는 모니터를 사용하여 해봤지만 실행하면 잠깐 멈추고 아무것도하지 않습니다. 전혀 오류가 표시되지 않으며 코드에 문제가없는 것을 발견 할 수 있습니다. 컴파일러의 문제입니까?왜 파스칼 사는이 코드를 모니터와 함께 실행하지 않습니까?

생산자 - 소비자 사용하여 세마포어 : 모니터를 사용

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

생산자 - 소비자 :

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

답변

0

경우 다른 사람이이 문제가 그냥에서 : 실수는 내가 시체를 만들지 않았다는 것이 었습니다. 변수는 초기화되는 "begin-end"입니다. 다음과 같은 절차 후 권리를 배치하지 않고 이동해야합니다

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

은 분명히이 바르를 초기화하는 데 더 이상 모든 necesary입니다. 마지막 시작 단계에서

관련 문제