resource philosopher import dining_server body philosopher(i : int; thinking, eating: int) write("philosopher", i, "alive, max think eat delays", thinking, eating) procedure think() var napping : int napping := int(random(1000*thinking)) writes("age=",age(),", philosopher ",i," thinking for ",napping," ms\n") nap(napping) end think procedure eat() var napping : int napping := int(random(1000*eating)) writes("age=",age(),", philosopher ",i," eating for ",napping," ms\n") nap(napping) end eat process phil do true -> think() writes("age=", age(), ", philosopher ", i, " is hungry\n") take_forks(i) writes("age=", age(), ", philosopher ", i, " has taken forks\n") eat() put_forks(i) writes("age=", age(), ", philosopher ", i, " has returned forks\n") od end phil end philosopher resource driver() import Parameters, philosopher var max_think_delay[1:num_phils] : int := ([num_phils] 5) var max_eat_delay[1:num_phils] : int := ([num_phils] 2) fa i := 1 to num_phils -> getarg(2*i+2, max_think_delay[i]); getarg(2*i+3, max_eat_delay[i]) af write(num_phils, "dining philosophers running", run_time, "seconds") write("starvation will be checked:", check_very_hungry) fa i := 1 to num_phils -> create philosopher(i, max_think_delay[i], max_eat_delay[i]) af nap(1000*run_time); write("must stop now"); stop end driver /* ............... Example compile and run(s) % m2sr -sc dp.m % sr -v; sr -o dp dp.sr dp_driver.sr SR version 2.3, October 1994 dp.sr: dp_driver.sr: dp.sr: dp_driver.sr: linking: % ./dp true 5 11 300 1 1 20 2 2 1 20 300 1 5 dining philosophers running 11 seconds starvation will be checked: true philosopher 1 alive, max think eat delays 300 1 age=106, philosopher 1 thinking for 82232 ms philosopher 2 alive, max think eat delays 1 20 age=120, philosopher 2 thinking for 920 ms philosopher 3 alive, max think eat delays 2 2 age=134, philosopher 3 thinking for 1878 ms philosopher 4 alive, max think eat delays 1 20 age=147, philosopher 4 thinking for 164 ms philosopher 5 alive, max think eat delays 300 1 age=161, philosopher 5 thinking for 293098 ms age=322, philosopher 4 is hungry *** at age 324 philosopher 4 may eat age=326, philosopher 4 has taken forks age=327, philosopher 4 eating for 10376 ms age=1043, philosopher 2 is hungry *** at age 1045 philosopher 2 may eat age=1047, philosopher 2 has taken forks age=1049, philosopher 2 eating for 536 ms age=1593, philosopher 2 has returned forks age=1595, philosopher 2 thinking for 281 ms age=1882, philosopher 2 is hungry *** at age 1885 philosopher 2 may eat age=1887, philosopher 2 has taken forks age=1888, philosopher 2 eating for 4078 ms age=2022, philosopher 3 is hungry *** at age 5979 philosopher 3 is VERY HUNGRY age=5983, philosopher 2 has returned forks age=5987, philosopher 2 thinking for 150 ms age=6142, philosopher 2 is hungry *** at age 10713 philosopher 3 may eat age=10715, philosopher 4 has returned forks age=10717, philosopher 4 thinking for 829 ms *** at age 10719 philosopher 3 may eat age=10720, philosopher 3 has taken forks age=10723, philosopher 3 eating for 432 ms must stop now */