Когда ваша основная программа завершает работу, все потоки прекращаются.
Потоки Perl работают одним из двух способов.
1) Вы можете использовать join
:
my $thr = threads->create(...);
# do something else while thread works
my $return = $thr->join(); # wait for thread to terminate and fetch return value
2) Вы можете использовать detach
:
my $thr = threads->create(...);
$thr->detatch(); # thread will discard return value and auto-cleanup when done
В этом сообщении перечислены потоки, которые не были очищены до завершения программы.
«Работает и не присоединился» - это случай 1, который все еще работает. «Завершено и не присоединено» - это случай 1, готово, но возвращаемое значение еще не получено. «Работает и отсоединен» - это случай 2, все еще работающий.
То есть, у вас есть 4 потока, которые были отсоединены, но не закончили до смерти программы. Из этого нельзя сказать, закончили бы они, если бы программа работала дольше, или они застряли в бесконечном цикле, или оказались в тупике, или как.
Вам не нужны замки для описываемой вами ситуации.