home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol162 / dinphil.ccp < prev    next >
Encoding:
Text File  |  1984-04-29  |  1.0 KB  |  46 lines

  1. program  diningphilosophers; 
  2.  
  3. const   forever = false;
  4. var     fork : array [0..4] of semaphore;
  5.         room ,screen  : semaphore;
  6.         i : integer;
  7. procedure eat(i:integer);
  8. begin
  9.   wait(screen);
  10.   writeln('philosopher ',i,' eating');
  11.   signal(screen);
  12. end;
  13.  
  14. procedure think(i:integer);
  15. begin
  16.   wait(screen);
  17.   writeln('philosopher ',i,' thinking');
  18.   signal(screen);
  19. end;
  20.  
  21. procedure philosopher(i :integer);
  22. begin
  23.   repeat
  24.         think(i);
  25.         wait(room);
  26.         wait(fork[i]);
  27.         wait(fork[(i+1) mod 5]);
  28.         eat(i);
  29.         signal(fork[i]);
  30.         signal(fork[(i+1) mod 5]);
  31.         signal(room);
  32.    until forever;
  33. end;
  34.  
  35. begin (* main program *)
  36.   room := 4;                             (* 4 seats for philosophers *)
  37.   screen := 1;
  38.   for i := 0 to 4 do fork[i] := 1;       (* 1 fork for each seat *)
  39.   cobegin                                (* now let the guys in  *)
  40.         philosopher(0);
  41.         philosopher(1);
  42.         philosopher(2);
  43.         philosopher(3);
  44.         philosopher(4);
  45.   coend 
  46. end.