2013-10-25 176 views
1

我有一個同步線程的問題,我不知道該怎麼做,有人可以幫助我嗎?Ruby多線程隊列

所以,事情是我必須以某種特定的順序啓動線程。 訂單如下:

線程1和線程7可以同時運行,其中一個線程完成後,下一個線程啓動(即線程2或/和線程6),線程3 (五) ,最後一個,兩個線程後3和5運行完畢後,去了最後一個,線程4

這是代碼,我曾與開始,但我在隊列實現莫名其妙地卡住。

MUTEX   = Mutex.new 
high_condition = ConditionVariable.new 
low_condition = ConditionVariable.new 
threads = [] 

7.times do |i| 
    threads << Thread.new{ 
    MUTEX.synchronize { 
     Thread.current["number"] = i 

     you_shall_not_pass 
    } 
    } 
end 

threads.map(&:join) 

def you_shall_not_pass 
    order = Thread.current["number"] 
end 
+0

你能告訴我們更多關於預期的產出和你得到? – JunaidKirkire

+0

歡迎來到StackOverflow!感謝您發佈您的代碼,但請在您的問題中多加一點說明:您有什麼問題,您期望得到什麼結果,以及[您嘗試過什麼](http://whathaveyoutried.com)到目前爲止?通過[問題清單](http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist)將幫助我們更好地回答你的問題。謝謝! –

+0

預期的輸出可以是這樣的: ' 線程1已經完成了它的任務 線程2已經完成了它的任務 Thread7已經完成了它的任務 Thread3已經完成了它的任務 Thread6已經完成了它的任務 Thread5已經完成了它的任務 Thread4有完成任務 ' 輸出並不重要,問題是以適當的方式啓動它們 –

回答

1

使用Ruby的Queue作爲counting semaphore。它阻止了pushpop操作,您可以使用該操作將有限數量的標記分發給線程,要求每個線程在運行之前獲取令牌並在完成時釋放令牌。如果使用2個標記初始化隊列,則可以確保一次只運行2個線程,並且可以按照您喜歡的任何順序創建線程。

require 'thread' 

semaphore = Queue.new 
2.times { semaphore.push(1) } # Add two concurrency tokens 

puts "#{semaphore.size} available tokens" 

threads = [] 
[1, 7, 2, 6, 3, 5, 4].each do |i| 
    puts "Enqueueing thread #{i}" 
    threads << Thread.new do 
    semaphore.pop # Acquire token 
    puts "#{Time.now} Thread #{i} running. #{semaphore.size} available tokens. #{semaphore.num_waiting} threads waiting." 
    sleep(rand(10)) # Simulate work 
    semaphore.push(1) # Release token 
    end 
end 

threads.each(&:join) 

puts "#{semaphore.size} available tokens" 
$ ruby counting_semaphore.rb 
2 available tokens 
Enqueueing thread 1 
Enqueueing thread 7 
2015-12-04 08:17:11 -0800 Thread 7 running. 1 available tokens. 0 threads waiting. 
2015-12-04 08:17:11 -0800 Thread 1 running. 0 available tokens. 0 threads waiting. 
Enqueueing thread 2 
Enqueueing thread 6 
2015-12-04 08:17:11 -0800 Thread 2 running. 0 available tokens. 0 threads waiting. 
Enqueueing thread 3 
Enqueueing thread 5 
Enqueueing thread 4 
2015-12-04 08:17:19 -0800 Thread 6 running. 0 available tokens. 3 threads waiting. 
2015-12-04 08:17:19 -0800 Thread 5 running. 0 available tokens. 2 threads waiting. 
2015-12-04 08:17:21 -0800 Thread 3 running. 0 available tokens. 1 threads waiting. 
2015-12-04 08:17:22 -0800 Thread 4 running. 0 available tokens. 0 threads waiting. 
2 available tokens