在Ruby中使用没有mutex.unlock的线程

时间:2014-01-10 12:23:32

标签: ruby multithreading

我不确定为什么这段代码有效:

m, n = Mutex.new, Mutex.new

t = Thread.new do
  m.lock
  p 'ha'
  sleep 1
  p 'ya'
  n.lock
end

s = Thread.new do
  m.lock
  p 'h'
  sleep 1
  p 'y'
  n.lock
end

t.join
s.join

我通过使用相同顺序的锁来避免死锁,但我不确定为什么这会起作用,因为每个互斥锁都需要同时具有mutex.lock和mutex.unlock,而且这段代码没有。解锁并仍然有效。为什么呢?

1 个答案:

答案 0 :(得分:1)

根据文档,Mutex#lock等待获取锁定。如果在获取锁之后添加某种输出,则在s失效之前,您应该看到它没有在线程t中执行。当t完成并被杀死时,锁被释放。