2012-05-11 4 views
1

あなたはインスタンスのメソッドをロックしたい場合、あなたはすべてのインスタンスとメソッドのMutexを作成する必要があります。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 

Thread.exclusiveはちょうど独占の範囲を定義する引数を取ることができれば、なぜミューテックスを作成しますか?

答えて

0

簡単な答えは、APIを記述したとおりに行うことができるということです。実際にはJavaは、あなたが任意のオブジェクトをロックすることによって何をしますか?ロックを追跡すると、オブジェクト自体にある予約済みの領域が使用されるため、トリックを実行する必要があります。また、オブジェクトがロックされて競合すると、実際のミューテックスを作成しなければなりません。しかし、うまくいけば、オブジェクトがロックされ、ロックが解除されていても、コードにはうまくいきません。私の推測では、Rubyのクリエイターは、余分な機能しか持たないすべてのオブジェクトに負担をかけたくないということです。

私はあなたが "clunky"と言ったときにコードの可読性を指していたと私は考えました。あなたがパフォーマンスについて心配しているなら、私は多くの違いがあるとは思わない。カバーの下でどちらのアプローチも同じ、非常に効率的な手法を使用することができます。これは、各オブジェクトに細いロックを格納する余分なメモリの問題です。私はそのことに関するいくつかの興味深い詳細を見つけたhere

+0

ジョン、ありがとう。私は、歴史的な議論や現在のルビーコミュニティの考え方を指し示す答えを得ることができるかどうかを確認するために、さらに数日待つつもりですが、そうでなければあなたの答えは素晴らしいです。 –

関連する問題