Рубиновые Темы в Темах - PullRequest
       5

Рубиновые Темы в Темах

0 голосов
/ 05 февраля 2019

У меня есть файл с многопоточностью, например:

Thread.new do
   # Do something
end.join

Мой вопрос касается подпотоков.Я знаю, что вышеупомянутый поток присоединится к основному потоку, и основной поток будет "ждать" завершения этого потока, прежде чем завершит основной поток.

Однако, как этот жизненный цикл работает в чем-то подобном этому примеру:

Thread.new do
    # Do Something

    Thread.new do
        # Do something else
    end.join
end.join

Присоединяется ли внутренний поток к родительскому потоку или к основному потоку?Внешняя нить "ждет" на внутренней нити, а основная нить "ждет" на основной нити?

Еще раз спасибо!

1 Ответ

0 голосов
/ 05 февраля 2019

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

Он только делает этопотому что ты сказал .join.Руби не ждет потоков;все потоки, не присоединенные к моменту завершения программы, уничтожаются.

Внутренний поток присоединяется к родительскому потоку или к основному потоку?

Этоименно то, что сказано делать: внешний поток говорит: «запустите поток, затем присоединитесь к нему, затем закончите».Основной поток будет ждать, пока все это завершится, потому что ему тоже было сказано .join внешнему потоку.

main  -launch-----------------------join
outer        \---launch-----join---/
inner                  \---/

Вот пример, где происходит обратное - опять же, только потому, что я явно сказал этоДля этого:

inner = nil
outer = Thread.new do
    inner = Thread.new do
        sleep(3)
        p "Inner done"
    end

    sleep(2)
    p "Outer done"
end

sleep(1)
inner.join
p "Inner joined"
outer.join
p "Outer joined"

main  -launch----------------join---join
outer        \---launch-----/------/
inner                  \---/
...