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 № 1Pelos 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.