最近,我一直在使用Ruby的线程,并发现了一种稍微出乎意料的行为。在关键部分中,调用raise
会导致互斥锁释放。我可以期望在synchronize
方法中出现这种情况,因为它有一个块,但是当单独调用lock
和unlock
时,这种情况似乎也会发生。
例如,下面的代码将输出:
$ ruby testmutex.rb
x sync
y sync
...在这里,我期望y
被阻塞直到宇宙热死。
m = Mutex.new
x = Thread.new() do
begin
m.lock
puts "x sync"
sleep 5
raise "x err"
sleep 5
m.unlock
rescue
end
end
y = Thread.new() do
sleep 0.5
m.lock
puts "y sync"
m.unlock
end
x.join
y.join
为什么即使x线程中的m.unlock从未被执行,y线程仍然被允许运行?