use threads (); use threads::shared (); my %exited : shared; use Thread::Exit end => sub { $exited{threads->tid} = 1 }; my $thread = threads->new( sub { whatever } ); my $tid = $thread->tid; while (!$exited{$tid}) { # do your stuff }