(*
   zastosowanie semaforow do "wzajemnego wykluczania"
   problem:
     przelewy miedzy kontami ...
*)

program np02;

var
  konto1:integer:=12345;
  konto2:integer:=0;
  sem:semaphore;

// ---procedury pomocnicze---
atomic procedure pokazProc(s:string);
begin
  writeln(s, "which_proc()=", which_proc);
end;
atomic procedure pokazKonta2;
begin
  writeln("  konto1+konto2=", konto1+konto2);
end;
procedure pokazKonta;
begin
  while true do pokazKonta2;
end;
// --------------------------

procedure proc;
var przelew:integer; s:string[50];
begin
  while true do
  begin

    wait(sem); // protokol wstepny

    stringCopy(s,"Poczatek-->"); pokazProc(s);
    //pokazProc("Poczatek-->"); //to jest blad w BACI !

    przelew:=random(100);
    konto1:=konto1-przelew;
    konto2:=konto2+przelew;

    stringCopy(s,"Koniec---->"); pokazProc(s);

    signal(sem); // protokol koncowy
  end;
end;

begin
  initialsem(sem,1); // tak tez mozna inicjowac semafor

  cobegin
    proc;
    proc;
    proc;
    proc;
    pokazKonta;
  coend;
end.

