최근 루비의 스레드로 작업 해 왔으며 약간의 예상치 못한 동작이 발견되었습니다. 중요한 섹션에서 raise
을 호출하면 뮤텍스가 해제됩니다. 이 블록이있는 synchronize
메서드를 예상 할 수 있지만 lock
및 unlock
을 별도로 호출하면 발생하는 것으로 보입니다.루비 예외로 인해 뮤 테이션이 잠금 해제되지 않습니다.
는 예를 들어, 아래 코드는 출력 : 나는 y
우주의 열 죽을 때까지 차단하는 기대
$ ruby testmutex.rb
x sync
y sync
을 ....
m = Mutex.new
x = Thread.new() do
begin
m.lock
puts "x sync"
sleep 5
raise "x err"
sleep 5
m.unlock
rescue
end
end
y = Thread.new() do
sleep 0.5
m.lock
puts "y sync"
m.unlock
end
x.join
y.join
x 스레드의 m.unlock이 실행되지 않는데도 왜 y 스레드가 실행될 수 있습니까?
이것은 흥미로운 관찰이다. 그러나 ... 당신의 질문은 무엇입니까? Ruby 내부 구현에서 "어떻게됩니까?" 왜 이런 일이 생길까요? 의도 된 것이거나 버그입니까? – Phrogz
나는 그것이 어떻게 구현 되었는가에 관해 궁금해하지만, 주된 사안은 당신이 많은 웅변으로 설명했다고 믿는 원인이다 --- 감사합니다. –