RosettaCodeData/Task/Dining-philosophers/Phix/dining-philosophers.phix
2016-12-05 23:44:36 +01:00

49 lines
1.6 KiB
Text

integer fork1 = init_cs(),
fork2 = init_cs(),
fork3 = init_cs(),
fork4 = init_cs(),
fork5 = init_cs()
integer terminate = 0 -- control flag
procedure person(sequence name, atom left_fork, atom right_fork)
-- (except Russell, who gets left and right the other way round)
while terminate=0 do
enter_cs(left_fork)
enter_cs(right_fork)
puts(1, name & " grabs forks.\n")
for i=1 to rand(10) do
-- if terminate then exit end if
puts(1, name & " is eating.\n")
-- sleep(1)
end for
puts(1, name & " puts forks down and leaves the dinning room.\n")
leave_cs(left_fork)
leave_cs(right_fork)
for i=1 to rand(10) do
-- if terminate then exit end if
puts(1, name & " is thinking.\n")
-- sleep(1)
end for
puts(1, name & " becomes hungry.\n")
end while
end procedure
constant r_person = routine_id("person")
constant threads = {create_thread(r_person,{"Aristotle",fork1,fork2}),
create_thread(r_person,{"Kant",fork2,fork3}),
create_thread(r_person,{"Spinoza",fork3,fork4}),
create_thread(r_person,{"Marx",fork4,fork5}),
-- create_thread(r_person,{"Russell",fork5,fork1})} -- this will deadlock!
create_thread(r_person,{"Russell",fork1,fork5})}
constant ESC = #1B
while not find(get_key(),{ESC,'q','Q'}) do
sleep(1)
end while
terminate = 1
wait_thread(threads) -- (not strictly necessary)
delete_cs(fork1) -- ""
delete_cs(fork2)
delete_cs(fork3)
delete_cs(fork4)
delete_cs(fork5)