最近,我一直在使用Ruby的線程,並發現了一些意外的行爲。在關鍵部分中,調用raise
會導致互斥體釋放。我可以期待這個synchronize
方法和它的區塊,但是當lock
和unlock
被單獨調用時,它似乎也會發生。ruby異常如何導致muttle解鎖?
例如,下面的代碼輸出:
$ 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
爲什麼y線程允許運行,即使x線程中的m.unlock永遠不會執行?
這是一個有趣的觀察。然而......你的問題是什麼? Ruby內部實現中的「如何實現」?爲什麼會發生?它是打算還是一個錯誤? – Phrogz
我很好奇它是如何實現的,但主要問題是原因,我相信你已經用很多口才解釋過了 - 謝謝。 –