my %mythreads; my $work_package = int($elements / $number_threads + 0.5); my @ReturnData :shared; my $start = 0; my $stop = $start + $work_package * $files - 1; $stop = $elements * $files - 1 if ($stop >= $elements * $files); for (my $i = 0; $i < $number_threads; $i++) { $mythreads{$i} = threads->create(\&do_work); $start = $stop + 1; $stop += $work_package * $files; $stop = $elements * $files - 1 if ($stop >= $elements * $files); } # collect data foreach (sort(keys(%mythreads))) { $mythreads{$_}->join(); }