RosettaCodeData/Task/Dining-philosophers/Julia/dining-philosophers.julia
2018-06-22 20:57:24 +00:00

83 lines
2.4 KiB
Text

mutable struct Philosopher
name::String
hungry::Bool
righthanded::Bool
rightforkheld::Channel
leftforkheld::Channel
function Philosopher(name, leftfork, rightfork)
this = new()
this.name = name
this.hungry = rand([false, true]) # not specified so start as either
this.righthanded = (name == "Aristotle") ? false : true
this.leftforkheld = leftfork
this.rightforkheld = rightfork
this
end
end
mutable struct FiveForkTable
fork51::Channel
fork12::Channel
fork23::Channel
fork34::Channel
fork45::Channel
function FiveForkTable()
this = new()
this.fork51 = Channel(1); put!(this.fork51, "fork") # start with one fork per channel
this.fork12 = Channel(1); put!(this.fork12, "fork")
this.fork23 = Channel(1); put!(this.fork23, "fork")
this.fork34 = Channel(1); put!(this.fork34, "fork")
this.fork45 = Channel(1); put!(this.fork45, "fork")
this
end
end
table = FiveForkTable();
tasks = [Philosopher("Aristotle", table.fork12, table.fork51),
Philosopher("Kant", table.fork23, table.fork12),
Philosopher("Spinoza", table.fork34, table.fork23),
Philosopher("Marx", table.fork45, table.fork34),
Philosopher("Russell", table.fork51, table.fork45)]
function dine(t,p)
if p.righthanded
take!(p.rightforkheld); println("$(p.name) takes right fork")
take!(p.leftforkheld); println("$(p.name) takes left fork")
else
take!(p.leftforkheld); println("$(p.name) takes left fork")
take!(p.rightforkheld); println("$(p.name) takes right fork")
end
end
function leavetothink(t, p)
put!(p.rightforkheld, "fork"); println("$(p.name) puts down right fork")
put!(p.leftforkheld, "fork"); println("$(p.name) puts down left fork")
end
contemplate(t) = sleep(t)
function dophil(p, t, fullaftersecs=2.0, hungryaftersecs=10.0)
while true
if p.hungry
println("$(p.name) is hungry")
dine(table, p)
sleep(fullaftersecs)
p.hungry = false
leavetothink(t, p)
else
println("$(p.name) is out of the dining room for now.")
contemplate(hungryaftersecs)
p.hungry = true
end
end
end
function runall(tasklist)
for p in tasklist
@async dophil(p, table)
end
while true begin sleep(5) end end
end
runall(tasks)