2016-06-30 45 views
0

我正在使用Eclipse Gavab 2.0编程Pascal-FC中的并发性。到目前为止,我还没有遇到任何问题,因为它总是告诉我哪些错误是无法执行程序的。 我用信号量做了生产者 - 消费者问题,它工作正常。现在我用显示器完成了它,但是当我运行它时,它启动了一秒钟然后停止,并且什么也不做。它根本没有显示任何错误,而且我也找不到任何错误的代码。这是编译器的问题吗?为什么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初始化瓦尔。在最后的开始结束。

相关问题