Ruby多线程:让一个线程等待来自另一个线程的信号

时间:2010-03-29 20:50:07

标签: ruby multithreading

在Ruby中,我希望有两个线程同时运行,并希望后台线程定期发出前台线程的信号。如何在后台线程显示“go”之前阻止前台线程阻塞?我可以想到几种方法,但是我选择了最合适的惯用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

(注意:背景可能会多次向前景发出信号。每次前景完成等待,它会重置积压。)

3 个答案:

答案 0 :(得分:1)

根据this page

,您需要使用条件变量和互斥锁

答案 1 :(得分: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

答案 2 :(得分:0)