2013-11-01 94 views
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 

希望有人能給我一些幫助!非常感謝!

回答

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