#! perl -slw use strict; use threads; use threads::shared; sub sumEm{ my $tid = threads->tid; my( $AoARef, $first, $n ) = @_; print "$tid: $first - ", $first + $n - 1; my @sums = ( 0 ) x 4; for my $i ( $first .. $first+$n-1 ) { $sums[ $_ ] += $AoARef->[ $i ][ $_ ] for 0 .. 3; } return @sums; } our $N ||= 1e6; our $T ||= 4; my @AoA:shared; $#AoA = $N; for( 0 .. $N -1 ) { $AoA[ $_ ] = &share([]); @{ $AoA[ $_ ] } = map rand( 100 ), 1 .. $T; } my $perThread = int $N / $T; my @threads = map{ threads->create( \&sumEm, \@AoA, $_* $perThread, $perThread ) } 0 .. $T-1; my @aves = ( 0 ) x 4; for my $thread ( @threads ) { my @subtotals = $thread->join; $aves[ $_ ] += $subtotals[ $_ ] for 0 .. 3; } $_ /= $N for @aves; print "@aves";