Ruby多线程:让一个线程等待另一个线程的信号
在Ruby中,我希望两个线程同时运行,并且希望后台线程周期性地向前台线程发送信号。如何让前台线程阻塞,直到后台线程显示“go”?我可以想出一些方法来实现它,但我追求的是最合适、最惯用的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 接收输入
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