условная переменная в главном потоке - PullRequest
0 голосов
/ 12 февраля 2011

В моем основном потоке я пытаюсь дождаться двух ресурсов из двух отдельных потоков. Способ, который я реализовал, выглядит следующим образом:

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

Есть ли лучший способ реализовать это? Я попытался использовать условные переменные: два потока сигнализируют об условных переменных, а основной поток ждет их. Но метод ожидания требует мьютекса в моем основном потоке, которого я стараюсь избегать.

Ответы [ 2 ]

0 голосов
/ 25 мая 2011

Один простой способ - получить очередь (назовем ее myqueue).Он безопасен для потоков и находится в модуле Thread

Вместо

Thread.current[:ready_to_go] = true

... do

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
0 голосов
/ 12 февраля 2011

Я не знаком с Ruby, но первый результат Google для "Ruby wait for thread" говорит:

вы можете дождаться завершения определенного потока, вызвав метод Thread # join этого потока. Вызывающий поток будет блокироваться до тех пор, пока данный поток не будет завершен. Вызвав соединение в каждом из потоков запросчиков, вы можете убедиться, что все три запроса были выполнены до завершения основной программы.

Обычно лучше использовать методы синхронизации, чтобы дождаться завершения чего-либо, а не зацикливаться, пока не будет достигнуто определенное состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...