Является ли код "mutex.unlock, если mutex.owned?"безопасно в Ruby? - PullRequest
0 голосов
/ 28 ноября 2018

Следующий упрощенный код (извлеченный из довольно большого многопоточного программного обеспечения) очень редко приводит к 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) может быть предпочтительнымвместо этого - но мне просто интересно, как должен вести себя вышеупомянутый фрагмент.И если я что-то упускаю в моем понимании.

...