最近,我一直在使用 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 线程运行?