use Thread::Queue; # in your "job shutdown" dispatcher: # # start the worker threads, passing the $q # my @workers = (); my %queues = (); my $q; $q = Thread::Queue->new(), push(@workers, threads->new(\&run, $q)), $queues{$workers[-1]->tid()} = $q foreach (1..$threadcount); # # wait for them all to tell you they're ready # my $resp = $_->dequeue() foreach (values %queues); # # now do yer thang...when you get a "shutdown event": # $queues{$killtid}->enqueue('Kill job');