advanced/threads_that_deadlock.rb
tests/_examples/advanced/threads_that_deadlock.rb in the metorex repository.
held = Mutex.new
held.lock
waiter = Thread.new { held.lock; :locked }
begin
p(waiter.value)
rescue Exception => error
p(error.class)
puts(error.message.lines.first)
end
held.unlock
p(waiter.value)
begin
Thread.stop
rescue ThreadError => error
p(error.message)
end
Thread.new { sleep(0.05); Thread.main.wakeup }
sleep
puts("main woken")
busy = Mutex.new
busy.lock
blocked = Thread.new { busy.synchronize { :never } }
Thread.pass until blocked.status == "sleep"
blocked.kill
p(blocked.join.status)
p(busy.locked?)
Output:
fatal
No live threads left. Deadlock?
:locked
"stopping only thread\n\tnote: use sleep to stop forever"
main woken
false
true