最近、私は 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 スレッドの実行が許可されるのはなぜですか?