Выполнение одной подпрограммы множеством потоков

столкнулся с проблемой вернее с тем как заставить множество потоков выполнять одну подпрограмму,насколько я понял в Perl для этого используется функция lock(), но при запуске кода:

use warnings;
use strict;
use threads;
use Time::HiRes qw ( time );
use threads::shared;
use Thread;
use Mutex;
my $ti=time();
my $max=1E8;
my $num_threads=4;
my $bonics :shared=0;
sub routine{
        my @Array=@_;
        $max=$Array[0] if @Array > 0;
        $max--;
        for my $num (0..$max){
        my $cont=0;
         $cont++ if ($num%5 == 0);
          $cont++ if ($num%7 == 2);
          $cont++ if ($num%9 == 0);
        {lock($bonics);$bonics++ if($cont==1)}
}
my $s=time()-$ti;
print("Entre 0 i $max hi ha $bonics numeros bonics.\n");
print("Calculus realitzats en $s segons.\n");

}
$_->join for map {threads->create(\&routine,999)} 1...$num_threads;

Выдает разные значения выполнения времени для одного и того же интервала чисел, возможно есть документация где нормально описано выполнения множеством потоков одной подпрограммы но я ее не нашел. Документацию на perldoc.perl.org уже перечитывал несколько раз.


Ответы (1 шт):

Автор решения: Кирилл Новгородцев

Треды Perl будет работать в однопоточном режиме, что бы вы ни делали. То есть, всегда будет задействовано одно ядро. Если это вас не смущает, то можете использовать модули вроде Coro.

Но, я бы советова воспользоваться чем-то вроде AnyEvent::Fork/AnyEvent::Fork::RPC, в зависимости от задач.

→ Ссылка