Следующий упрощенный код (извлеченный из довольно большого многопоточного программного обеспечения) очень редко приводит к ThreadError: Attempt to unlock a mutex which is not locked
:
begin
yield(mutex) if mutex.try_lock
ensure
mutex.unlock if mutex.owned?
end
в строке 4.
Это вRuby 2.1.5, который сейчас EOF, но, насколько я понимаю, вызов mutex.unlock
безопасен, если текущий поток владеет мьютексом, который проверяется с помощью mutex.owned?
.Буду ли я ошибаться в этом предположении?
Я считаю, что yield(mutex)
в строке 2 никогда не пытается разблокировать полученный мьютекс.
Я понимаю, что использование чего-то вроде mutex.synchronize(&block)
может быть предпочтительнымвместо этого - но мне просто интересно, как должен вести себя вышеупомянутый фрагмент.И если я что-то упускаю в моем понимании.