Иногда это выполняется непосредственно перед завершением работы программы или в тот момент, когда потребуется возвращаемое значение подпрограммы, выполняемой в потоке. Если выполнение потока еще не закончено, метод jоin () блокируется до тех, пока это не произойдет.
Продолжая предыдущий пример, предположим, что в какой-то момент в основном потоке потребовалось значение числа ПИ, вычисленного в подпрограмме calculate_pi. Это можно сделать с помощью следующего вызова:
my $pi = $thread->join;
В отличие от способа организации программы с родительскими и дочерними процессами, при котором только родительский процесс может вызывать функцию wait () с указанием в качестве параметра одного из своих дочерних процессов, между потоками нет какой-либо строгой родительско-дочерней связи. Любой поток может вызывать метод join любого другого потока, но не может вызывать метод jоin () самого себя.
Для завершения работы потока достаточно только вызвать функцию return () в выполняемой в нем подпрограмме или просто позволить потоку управления дойти естественным образом до конца блока подпрограммы. В потоках никогда не вызывается функция exit () языка Perl, поскольку это может привести к уничтожению и текущего, и всех других потоков, а это нежелательно. К тому же, ни один поток, кроме основного, не должен предпринимать попытку установить обработчик сигнала. Нет такого способа, который бы позволил гарантировать доставку сигнала именно тому потоку, для которого он предназначен, и поэтому вполне вероятно, что такая попытка приведет к аварийному завершению работы интерпретатора Perl.
Работа потока может также завершиться аварийно в результате вызова функции die () с сообщением об ошибке. Однако применение функции die () в потоке приводит далеко не к тому результату, на который мог рассчитывать разработчик.