0

Eclipse Gavab 2.0 を使用して Pascal-FC で並行処理をプログラミングしています。プログラムを実行できない場合、エラーが何であるかを常に通知するため、これまでのところ使用に問題はありません。セマフォを使用して生産者と消費者の問題を解決しましたが、問題なく機能しました。モニターを使用して実行しましたが、実行すると、1秒間起動してから停止し、他に何もしません。エラーはまったく表示されず、コードに問題はありません。コンパイラの問題ですか?

セマフォを使用したプロデューサー/コンシューマー:

   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.

セマフォの出力を使用したプロデューサー/コンシューマー

モニターを使用したプロデューサー/コンシューマー:

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.

モニターの出力を備えたプロデューサー/コンシューマー

4

1 に答える 1

0

他の誰かがこの問題を抱えている場合に備えて: エラーは、変数が初期化される「開始-終了」であるモニターの本体を作成しなかったことです。手順の直後に配置する必要があり、次のようになります。

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

明らかに、変数を初期化する必要はなくなりました。最後の始まりと終わり。

于 2016-07-01T11:06:41.690 に答える