2012-05-11 2 views
1

, 당신은 모든 인스턴스 및 방법 Mutex을 만들어야합니다 : Thread.exclusive 걸릴 인수를 갖는 논리적 오류가Thread.exclusive가 "범위"인수를 취하지 않는다는 논리적 인 이유가 있습니까? 당신이 경우에 방법을 잠 그려면

class Foo 
    def initialize 
    @blue_mutex = Mutex.new 
    @red_mutex = Mutex.new 
    end 

    def blue 
    @blue || @blue_mutex.synchronize do 
     @blue ||= Blue.new 
    end 
    end 

    def red_mutex 
    @red || @red_mutex.synchronize do 
     @red ||= Red.new 
    end 
    end 
end 

있습니까? Thread.exclusive 그냥 독점의 범위를 정의하는 인수를 할 수 있다면

class Foo 
    def blue 
    @blue || Thread.exclusive("#{object_id}/blue") do 
     @blue ||= Blue.new 
    end 
    end 

    def red 
    @red || Thread.exclusive("#{object_id}/red") do 
     @red ||= Red.new 
    end 
    end 
end 

왜 뮤텍스를 만들?

답변

0

짧은 대답은 API가 설명대로 수행 될 수 있다는 것입니다. 사실 Java은 임의의 객체를 잠글 수있게합니다. 잠금 장치를 추적하면 개체 자체의 예약 된 공간을 사용하기 때문에 트릭을 재생해야합니다. 또한 객체가 잠겨져 경합을 당하면 실제 뮤텍스가 만들어 져야하며, 더 많은 공간이 필요합니다. 하지만 코드가 잠금 및 잠금 해제 된 객체로 인해 잘 쌓이지 않아도됩니다. 내 추측에 따르면 Ruby 제작자는 드물게 사용되는이 추가 기능으로 모든 객체에 부담을주고 싶지 않습니다.

나는 "clunky"라고 말하면 코드의 가독성을 언급했다. 퍼포먼스가 걱정된다면 많은 차이가있을 것입니다. 이 두 가지 접근법은 동일한 매우 효율적인 기법을 사용할 수 있습니다. 각 객체에 얇은 잠금을 저장하는 추가 메모리에 대한 질문 일뿐입니다. 그 부분에 대한 흥미로운 내용을 발견했습니다. here

+0

John, 감사합니다. 나는 루비 커뮤니티의 역사적 토론이나 현재의 사고 방식을 가리키는 답변을 얻을 수 있는지 알아보기 위해 며칠 더 기다려야 하겠지만 그렇지 않다면 당신의 대답은 훌륭합니다. –

관련 문제