home *** CD-ROM | disk | FTP | other *** search
- program diningphilosophers;
-
- const forever = false;
- var fork : array [0..4] of semaphore;
- room ,screen : semaphore;
- i : integer;
- procedure eat(i:integer);
- begin
- wait(screen);
- writeln('philosopher ',i,' eating');
- signal(screen);
- end;
-
- procedure think(i:integer);
- begin
- wait(screen);
- writeln('philosopher ',i,' thinking');
- signal(screen);
- end;
-
- procedure philosopher(i :integer);
- begin
- repeat
- think(i);
- wait(room);
- wait(fork[i]);
- wait(fork[(i+1) mod 5]);
- eat(i);
- signal(fork[i]);
- signal(fork[(i+1) mod 5]);
- signal(room);
- until forever;
- end;
-
- begin (* main program *)
- room := 4; (* 4 seats for philosophers *)
- screen := 1;
- for i := 0 to 4 do fork[i] := 1; (* 1 fork for each seat *)
- cobegin (* now let the guys in *)
- philosopher(0);
- philosopher(1);
- philosopher(2);
- philosopher(3);
- philosopher(4);
- coend
- end.