Почему основной код между первым присоединенным потоком не выполняется до присоединения второго потока? - PullRequest
0 голосов
/ 04 мая 2018

Я изучаю темы и имею следующий код:

def timefunc(delay)
  i = 0
  while i <= 2
    puts "func w/ #{delay} second delay at: #{Time.now}"
    puts "Thread priority: #{Thread.current.priority}"
    sleep(delay)
    i = i + 1
  end
end

puts "Started program at #{Time.now}"

t1 = Thread.new{timefunc(2)}
t2 = Thread.new{timefunc(1)}

puts "before joins"

t1.join
puts "between joins"
t2.join

puts "after joins"

puts "Ended program at #{Time.now}"

Вывод был:

Started program at 2018-05-04 10:23:51 -0600
before joins
func w/ 1 second delay at: 2018-05-04 10:23:51 -0600
func w/ 2 second delay at: 2018-05-04 10:23:51 -0600
Thread priority: 0
Thread priority: 0
func w/ 1 second delay at: 2018-05-04 10:23:52 -0600
Thread priority: 0
func w/ 2 second delay at: 2018-05-04 10:23:53 -0600
Thread priority: 0
func w/ 1 second delay at: 2018-05-04 10:23:53 -0600
Thread priority: 0
func w/ 2 second delay at: 2018-05-04 10:23:55 -0600
Thread priority: 0
between joins
after joins
Ended program at 2018-05-04 10:23:57 -0600

Я полагал, что поток, запущенный в t1.join, выполнит всю свою работу, прежде чем позволить main выполнить puts "between joins", но я был удивлен, когда t2.join также был выполнен первым. Ищет ли переводчик какие-либо операторы соединения и запускает ли их в первую очередь? Как это работает?

1 Ответ

0 голосов
/ 04 мая 2018

Я думаю, вы можете найти это изменение полезным:

sleep 10
puts "before joins"

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

t1.join аналогично, но вместо ожидания 10 секунд вместо этого говорится: «не позволяйте текущему потоку продолжаться, пока t1 не будет завершен». Таким образом, он «выполняет всю свою работу»: он ждет, пока закончится t1, к этому времени также будет выполнено t2. Итак, вы видите промежуточный и последующий выходы вплотную.

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