my @threads = map threads->new( \&processrefsthread, $Q ), 1 .. $T; #### sub threadProc { my $code = shift; for(1 .. 5 ){ my @rv = eval { $code->( @_ ); }; if( $@ ) { ## log errors if applicable ## next if retrying makes sense. ## last if not. tprint "$@; retrying"; } else { return @rv; ## return any return values if applicable. ## think about scalar/list/void context. } } } my @threads = map threads->new( \&threadProc, \&processrefsthread, $Q ), 1 .. $T; #### sub processrefsthread { my $Q = shift; tprint 'Starting'; while( my $job = $Q->dq() ) { tprint "processing job $job"; my $d = int(rand(5)); unless( $d ) { 12345 / $d; } for my $i (0 .. $d * 500000) { my $j = $i * $d; $j = int(rand($j)); } } tprint 'Ending'; } #### C:\test>1056140-buk Useless use of division (/) in void context at C:\test\1056140-buk.p [1] Starting [2] Starting [3] Starting [4] Starting [2] processing job 1 [1] processing job 2 [3] processing job 3 [4] processing job 4 [4] processing job 5 [4] processing job 6 [1] processing job 7 [3] processing job 8 [4] processing job 9 [4] Illegal division by zero at C:\test\1056140-buk.pl line 25. ; retrying [4] Starting [2] processing job 10 [4] processing job 11 [2] Illegal division by zero at C:\test\1056140-buk.pl line 25. ; retrying [2] Starting [2] processing job 12 [3] processing job 13 [2] processing job 14 [1] processing job 15 [1] Illegal division by zero at C:\test\1056140-buk.pl line 25. ; retrying [1] Starting ... #### my $Q - ...; sub thread { while( $Q->dq( ) ) ... } }