此简单测试的结果主要是
(1) rescue break, m.locked?: false
但有时候我可以看到
(1) rescue break, m.locked?: true
m = Mutex.new
6.times do
Thread.new do
begin
m.synchronize do
puts 't1 action'
3.times do
puts '.'
sleep 0.5
end
raise 'Break'
end
rescue
puts "(1) rescue break, m.locked?: #{m.locked?}"
m.synchronize do
sleep 0.1
end
puts '(2) after m {sleep}'
sleep 0.1
puts 'rescue break 2'
end
end
sleep 0.1
t2 = Thread.new do
puts 't2 waiting for mutex'
m.synchronize do
puts '(3) t2 action'
end
end
t2.join
sleep 0.2
puts;puts;
end
我希望救援块中的互斥锁将始终被解锁。
环境: Ruby v2.6.3.62(2019-04-16)[x64-mingw32]
答案 0 :(得分:1)
没有人保证处理器会停止世界,等待您的行动:)话虽如此,
raise 'Break'
和
puts "(1) rescue break, m.locked?: #{m.locked?}"
还有另一个线程可能会获得执行时间,并进而锁定互斥锁。
。请注意
raise 'Break'
end
rescue
puts "(1) rescue break, m.locked?: #{m.locked?}"
实际上与
相同 end
puts "(1) rescue break, m.locked?: #{m.locked?}"
在后面的代码段中,应该清楚m
可能被另一个线程锁定,也可能未被锁定;我们刚刚发布了,所以没有希望。