1

インスタンスのメソッドをロックする場合はMutex、すべてのインスタンスとメソッドに対してを作成する必要があります。

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排他性の範囲を定義する引数を取ることができるのに、なぜミューテックスを作成するのですか?

4

1 に答える 1

0

簡単な答えは、あなたが説明した方法で API を実行できるということです。実際、これはJavaが任意のオブジェクトをロックできるようにすることで行っていることです。ロックの追跡はオブジェクト自体の予約済みスペースを使用するため、トリックを実行する必要があります。また、オブジェクトがロックされて競合が発生した場合は、実際のミューテックスを作成する必要があり、より多くのスペースを使用します。しかし、ロックされたりロック解除されたりするオブジェクトがコードに散らばっていないことを願っています。私の推測では、Ruby の作成者は、使用頻度の低いこの余分な機能をすべてのオブジェクトに負担をかけたくありませんでした。

上記で、「ぎこちない」と言ったときは、コードの読みやすさを指していると思いました。パフォーマンスを気にするなら、大きな違いはないと思います。内部では、どちらのアプローチでも同じ非常に効率的な手法を使用できます。各オブジェクトに薄いロックを格納するための余分なメモリの問題です。ここでそれについていくつかの興味深い詳細を見つけました

于 2012-06-09T00:00:52.027 に答える