2010-03-29 6 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

В МРТ («C» рубиновые версии 1.8.6 или 1.9.2) это будет работать, так как гигантская большой замок вокруг всего кода ruby, так что, хотя у вас есть 2 потока, только один может когда-либо запускаться одновременно ... В JRuby или IronRuby, однако, потоки будут выполняться одновременно, и код не будет безопасным. Вам нужно будет использовать 'Mutex' и' ConditionVariable' для управления этим –

1

You 'd хотите использовать условные переменные и мьютексы, согласно this page

Смежные вопросы