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( ) )
...
}
}