最近、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
誰かが私に助けてくれることを願っています!! どうもありがとう!