home *** CD-ROM | disk | FTP | other *** search
/ cs.rhul.ac.uk / www.cs.rhul.ac.uk.zip / www.cs.rhul.ac.uk / pub / CS375 / philsem2.pfc < prev    next >
Text File  |  1999-03-15  |  816b  |  42 lines

  1. program philsem2;
  2.  
  3. (* Dining Philosophers - semaphore version 2 
  4. File is /CS/ftp/pub/CS375/sems/philsem2.pfc *)
  5.  
  6. const
  7.    N = 5;
  8. var 
  9.    fork : array [1..N] of semaphore;  (* binary *)
  10.    freechairs : semaphore;  (* general *)
  11.    i : integer;
  12.  
  13. process type philosophers(name : integer);
  14. begin
  15.    repeat
  16.       sleep(random(3));   (* THINKING *)
  17.       wait(freechairs);
  18.       wait(fork[name]);
  19.       wait(fork[(name mod N) + 1]);
  20.       sleep(random(3));   (* EATING *)
  21.       writeln(name);
  22.       signal(fork[name]);
  23.       signal(fork[(name mod N) + 1]);
  24.       signal(freechairs)
  25.    forever
  26. end;  (* philosophers *)
  27.  
  28. var
  29.    phils: array[1..N] of philosophers;
  30.  
  31. begin
  32.    for i := 1 to N do
  33.       initial(fork[I],1);
  34.    initial(freechairs,N - 1);
  35.    cobegin
  36.       for i := 1 to N do
  37.          phils[i](i);
  38.    coend
  39. end.
  40.  
  41.  
  42.