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

Ruby多线程:让一个线程等待另一个线程的信号,ruby,multithreading,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#后台,线程1 睡眠3 接收输入

在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#后台,线程1
睡眠3
接收输入

告诉(u前台)(u输入(u准备就绪)您希望使用条件变量和互斥量,根据

的结果,这非常有效:

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

这里有一个简洁明了的实现:

在MRI(“C”ruby版本1.8.6或1.9.2)中,这将起作用,因为所有ruby代码周围都有一个巨大的锁,所以即使您有两个线程,一次也只能运行一个线程。。。然而,在JRuby或IronRuby中,线程将同时运行,代码将不安全。您需要使用
Mutex
ConditionVariable
来管理它
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