异常如何准确地解锁互斥锁?

时间:2019-06-26 05:42:13

标签: ruby exception mutex synchronize

此简单测试的结果主要是
(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]

1 个答案:

答案 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可能被另一个线程锁定,也可能未被锁定;我们刚刚发布了,所以没有希望。