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