主线程中的条件变量

时间:2011-02-12 02:00:56

标签: ruby multithreading

在我的主线程中,我试图从两个独立的线程中等待两个资源。我实施的方式如下:

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方法在我的主线程中需要一个互斥锁,我试图避免使用它。

2 个答案:

答案 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