при запуске потока, его объект сохраняется в именованном массиве. нужно как то проверить запущен ли поток или уже закончился и прибить его если запущен:
use threads;
my %thr = ();
sub run_thread() {
my ($thr_name) = @_;
# как проверить?
$thr{$thr_name} = threads->create(\&ololo);
$thr{$thr_name}->join();
}