gpt4 book ai didi

ruby - ruby 异常如何导致 mutices 解锁?

转载 作者:数据小太阳 更新时间:2023-10-29 07:18:00 25 4
gpt4 key购买 nike

最近,我一直在使用 Ruby 的线程,并发现了一个稍微出乎意料的行为。在关键部分,调用 raise 会导致互斥体释放。我可以预料到 synchronize 方法及其 block 会出现这种情况,但它似乎也发生在分别调用 lockunlock 时。

例如,下面的代码输出:

$ 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 线程却被允许运行?

最佳答案

请注意,如果您从 x 中删除 raiseunlock,则行为是相同的。所以你有这样一种情况,x 线程锁定了互斥体,然后线程结束,互斥体被解锁。

m = Mutex.new
Thread.new{ m.lock; p m.locked? }.join
#=> true

p m.locked?
#=> false

因此我们看到情况与raise无关。因为您在 raise 周围有一个 begin/rescue block ,所以您只需比其他方式提前 5 秒退出 x 线程。

据推测,解释器会跟踪任何被线程锁定的互斥体,并在线程死亡时自动并有意地解锁它们。 (但是,我无法通过源代码检查来支持这一点。这只是基于行为的猜测。)

关于ruby - ruby 异常如何导致 mutices 解锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7614163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com