0

Я программирую параллелизм в Pascal-FC, используя 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 
    cont := 0; 
    posProd := 1; posCons := 1; 
end; 

Очевидно, что это больше не necesary инициализировать ВАР. на последнем начальном этапе.

 Смежные вопросы

  • Нет связанных вопросов^_^