2012-09-18 79 views
1

我想要多個線程同時觸發所有的線程。在ruby中同步線程

10.times do 
    Thread.new do 
    sleep rand(5)    # Initialize all the stuff 
    wait_for_all_other_threads # Wait for other threads to initialize their stuff 
    fire!      # Go. 
    end 
end 

我將如何實現wait_for_all_other_threads所以他們都fire!在同一時間?

回答

0
require "thread" 

N = 100 

qs = (0..1).map { Queue.new } 

t = 
    Thread.new(N) do |n| 
    n.times { qs[0].pop } 
    n.times { qs[1].push "" } 
    end 

ts = 
    (0..N-1).map do |i| 
    Thread.new do 
     sleep rand(5) # Initialize all the stuff 
     STDERR.puts "Init: #{i}" 
     qs[0].push "" 
     qs[1].pop  # Wait for other threads to initialize their stuff 
     STDERR.puts "Go: #{i}"  # Go. 
    end 
    end 
[t, *ts].map(&:join) 
+0

的OP希望所有的工作線程暫停,並在更多或更少的疏通的同時,也就是在同一個事件,只有* *後,他們都被初始化。這段代碼取消了一個獨立於所有其他工作者的工作者線程,而不是OP想要的東西。 – pilcrow

+0

@pilcrow謝謝你指出這一點,我完全錯過了它。看起來像一個隊列是不夠的。編輯答案。 –