2013-01-17 2 views
1

Mutex # synchronize를 호출하면 코드가 실행되지 않는 이유가 무엇인지 이해하려고합니다. 동기화를 호출 할 때 뮤텍스가 잠기지 않으므로 블록에서 코드를 방해해서는 안됩니다. 잠금 장치가없는 두 번째 스레드는 방해받지 않고 실행됩니다.mutex 동기화가 실행을 방해하는 이유는 무엇입니까?

m  = Mutex.new 
count1 = count2 = 0 

Thread.new do 
    loop do 
    m.syncronize do 
     count1 += 1 
    end 
    end 
end 
Thread.new do 
    loop do 
    count2 += 1 
    end 
end 
sleep 1 
p count1 # => 0 
p count2 # => 1645454 

참고 : 예를 명확히하기 위해 두 번째 비 잠금 스레드를 추가했습니다. 행동을 바꾸지 않는 것으로 보입니다.

MRI 1.9.3-p362를 실행 중입니다.

답변

3

오타가 있습니다. syncronize이 아니라 synchronize입니다. 그래서 그 스레드가 중단되고 아무것도 계산하지 않습니다.

여기에 오타 내 출력은 고정이다 : 나는 #join라고했다면

m  = Mutex.new 
count1 = count2 = 0 

Thread.new do 
    loop do 
    m.synchronize do 
     count1 += 1 
    end 
    end 
end 
Thread.new do 
    loop do 
    count2 += 1 
    end 
end 
sleep 1 
p count1 # => 1987049 
p count2 # => 19060675 
+0

, 나는 그것을 잡은 것이다. 스레드에 대한 내 이해를 재고 할 필요가 없기 때문에 기쁩니다! –

관련 문제