最近我要解决一个与 ruby 中的多线程相关的问题。
我想知道是否有一个互斥体的哈希数组,我可以在需要时新建一个互斥体。
例如,我有 3 个资源和 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 开始,我不会看到 0 或 1 再次开始,直到 1 或 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
希望有人能给我一些帮助!!非常感谢!