0

最近我要解决一个与 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

希望有人能给我一些帮助!!非常感谢!

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 回答