Обратите внимание: если вы удалите raise
и unlock
из x
, то поведение будет таким же.Таким образом, у вас есть ситуация, когда поток x
блокирует мьютекс, а затем поток заканчивается, и мьютекс разблокируется.
m = Mutex.new
Thread.new{ m.lock; p m.locked? }.join
#=> true
p m.locked?
#=> false
Таким образом, мы видим, что ситуация не связана с raise
.Поскольку у вас есть блок begin/rescue
вокруг вашего raise
, вы просто выходите из потока x
на 5 секунд раньше, чем в противном случае.
Предположительно, интерпретатор отслеживает любые мьютексы, заблокированные потоком, иавтоматически и намеренно разблокирует их, когда поток умирает.(Однако я не могу подтвердить это проверкой исходного кода. Это всего лишь предположение, основанное на поведении.)