2010-03-29 91 views
2

在Ruby中,我想讓兩個線程同時運行,並希望後臺線程定期發送前臺線程的信號。如何讓前臺線程阻塞,直到後臺線程顯示'去'?我可以想到一些方法來做到這一點,但是在最恰當的,慣用的Ruby方法之後。Ruby多線程:讓一個線程等待來自另一個線程的信號

在代碼:

loop do # background, thread 1 
    sleep 3 
    receive_input 
    tell_foreground_input_is_ready # <-- how do I do this? 
end 

loop do # foreground, thread 2 
    wait_for_signal_from_background # <-- how do I do this? 
    do_something 
end 

(注意:背景可能每次前景完畢等待信號多次到前臺,它重置積壓)

回答

1

原來這個工程相當不錯:

require 'thread' 
queue = Queue.new 
Thread.new do 
    100.times do |i| 
    sleep 1 
    queue.enq i 
    end 
end 

loop do 
    print "waiting... " 
    puts queue.deq  # this function blocks. 
end 
+0

在MRI(「C」 Ruby版本1.8.6或1.9.2),這將工作,因爲有一個巨大的圍繞所有ruby代碼的大鎖,所以即使你有2個線程,一次只能運行一個線程......但在JRuby或IronRuby中,線程將同時運行,並且代碼將不安全。你需要使用'Mutex'和'ConditionVariable'來管理這個 – 2011-04-21 00:36:06