在我的主线程中,我试图从两个独立的线程中等待两个资源。我实施的方式如下:
require 'thread'
def new_thread
Thread.current[:ready_to_go] = false
puts "in thread: new thread"
sleep(5)
puts "in thread: sleep finished"
Thread.current[:ready_to_go] = true
sleep(2)
puts "in thread: back to thread again!"
end
thread1 = Thread.new do
new_thread
end
thread2 = Thread.new do
new_thread
end
# the main thread wait for ready_to_go to start
while (!(thread1[:ready_to_go] && thread2[:ready_to_go]))
sleep(0.5)
end
puts "back to main!"
sleep(8)
puts "main sleep over!"
thread1.join
thread2.join
有没有更好的方法来实现这个?我试图使用条件变量:两个线程发出条件变量信号,主线程等待它们。但是wait方法在我的主线程中需要一个互斥锁,我试图避免使用它。
答案 0 :(得分:0)
我不熟悉Ruby,但the first Google result for "Ruby wait for thread"说:
您可以通过调用该线程的Thread#join方法等待特定线程完成。调用线程将阻塞,直到给定的线程完成。通过在每个请求者线程上调用join,可以确保在终止主程序之前所有三个请求都已完成。
通常最好使用同步方法等待某些事情完成,而不是循环直到达到特定状态。
答案 1 :(得分:0)
一个简单的方法是获得一个队列(让我们称之为myqueue
)。它是线程安全的,位于Thread模块
而不是
Thread.current[:ready_to_go] = true
...做
myqueue.push :ready_to_go
然后你的主线程将是:
junk = myqueue.pop # wait for thread one to push
junk = myqueue.pop # wait for thread two to push
# go on with your work