/ / Usando encadeamentos sem mutex.unlock em Ruby - ruby, multithreading

Usando encadeamentos sem mutex.unlock em Ruby - ruby, multithreading

Eu não tenho certeza porque este código funciona:

m, n = Mutex.new, Mutex.new

t = Thread.new do
m.lock
p "ha"
sleep 1
p "ya"
n.lock
end

s = Thread.new do
m.lock
p "h"
sleep 1
p "y"
n.lock
end

t.join
s.join

Eu evitei um impasse usando as travas nomesma ordem, mas eu não tenho certeza porque isso funciona, já que todo mutex precisa ter mutex.lock e mutex.unlock, e este código não tem .unlock e ainda funciona. Por quê?

Respostas:

1 para resposta № 1

Pelos docs, Mutex # lock aguarda até que o bloqueio seja adquirido. Se você adicionar algum tipo de saída depois de adquirir os bloqueios, verá que ele não está sendo executado no encadeamento s até t está morto. Quando t está feito e é morto o bloqueio é liberado.