summaryrefslogtreecommitdiff log msg author committer range
path: root/sample/philos.rb
blob: 119e7c36b93d233bbaeac2cc1cee1eaf2192f026 (plain)
 ```1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 ``` ``````# # The Dining Philosophers - thread example # require "thread" srand #srand N=9 # number of philosophers \$forks = [] for i in 0..N-1 \$forks[i] = Mutex.new end \$state = "-o"*N def wait sleep rand(20)/10.0 end def think(n) wait end def eat(n) wait end def philosopher(n) while TRUE think n \$forks[n].lock if not \$forks[(n+1)%N].try_lock \$forks[n].unlock # avoid deadlock next end \$state[n*2] = ?|; \$state[(n+1)%N*2] = ?|; \$state[n*2+1] = ?*; print \$state, "\n" eat(n) \$state[n*2] = ?-; \$state[(n+1)%N*2] = ?-; \$state[n*2+1] = ?o; print \$state, "\n" \$forks[n].unlock \$forks[(n+1)%N].unlock end end for n in 0..N-1 Thread.start(n){|i| philosopher(i)} sleep 0.1 end sleep ``````