0

最近、Ruby のマルチスレッドに関連する問題を解決する必要があります。

必要なときにミューテックスを新しく作成できるミューテックスのハッシュ配列があるかどうかを知りたいです。

たとえば、3 つのリソースと 5 つのスレッドがあります。そして、2 つのスレッドが最初のリソースを使用し、別の 2 つのスレッドが 2 番目のリソースを使用し、最後のスレッドが 3 番目のリソースを使用します。

したがって、最初の 2 つのスレッドと 2 番目の 2 つのスレッドは実行するスレッドを 1 つしか選択できず、もう 1 つのスレッドは待機する必要があります。しかし、5 番目のスレッドはそれらと一緒に実行できます。

したがって、ミューテックスを配列に書き込む方法があることを願っています。

と同じように:

a = Hash.new
a["1"] = Mutex.new

def init    
  if a[string] == nil
    a[string] = Mutex.new
  end
end

スレッド実行:

thread1 do |string|
  a[string].synchronize do
    run_unsafe_code
  end
end

私は以下のようにコードを書きます:

しかし、うまくいきません:

私は結果を見たいと思っています:

0 または 1 が開始した場合、1 または 1 が終了するまで、0 または 1 が再び開始することはありません。

#!/usr/bin/ruby
require 'thread'
class Install
  @@x = Hash.new
  def initialize(url)
    @url = url
    if @@x[url] == nil
      puts url
      @@x[url.to_sym] = Mutex.new
    end
  end

  def work()
    puts @url+" start."
    @@x[@url.to_sym].synchronize do
      5.times do 
        puts @url+" ."
        sleep 1
      end
    end
    puts @url+" end."
  end
end

thread = [] 
job = []

3.times do |i|
  job << Install.new(i.to_s)
end
2.times do |i|
  job << Install.new(i.to_s)
end       

job.each do |x|
  thread << Thread.new do
    x.work
  end
end

thread.each do |s|
  s.join
end

誰かが私に助けてくれることを願っています!! どうもありがとう!

4

1 に答える 1

0

コードに問題はありません。現在の動作方法では、最初に「開始」を出力してからミューテックスを待ちます。実際にロックを開始した後に「開始」を出力したいだけかもしれません:

def work()
  @@x[@url.to_sym].synchronize do
    puts @url+" start."
    5.times do 
      puts @url+" ."
      sleep 1
    end
    puts @url+" end."
  end
end
于 2013-11-01T12:51:05.347 に答える