実際、2スレッドが開始されたとしましょう。そして5つの要素の配列は、すべての計算が1つの取引で行われます。 2が現れ、仕事の欠如のために死ぬ。または、9999要素を指定すると、彼は最後の30-50項目で目を覚まします。彼は本当にマルチスレッドではないようです。スレッドの最大値
#! usr/bin/perl -w
use strict;
use warnings;
use 5.010;
use threads;
use threads::shared;
use Data::Dumper;
my $n=0;
my $max:shared=0;
my @threads;
my $shr:shared=0;
say "Enter the number of threads";
my $threads=<stdin>;
my @pack;
#Заполняем массив
say "Enter the number of array elements";
my $c=<stdin>;
for (my $i=0;$i<$c;$i++){
my $r= int rand 999;
@pack=(@pack,$r);
}
say @pack;
# Создаём нужное количество потоков
for my $t (1..$threads) {
push @threads,threads->create(\&find,$t);
}
# Дожидаемся окончания работы всех потоков
for my $t (@threads){ $t->join();}
sub find {
# Номер текущего потока
my $num= shift;
say "+Thread $num started";
while($n<=$#pack){
# Распределяем элементы по потокам
lock($shr);#lock ($max);
my $stg=1+$shr++;
# Если элементы закончились, прерываем работу
if ($stg>=$#pack+2) {
say "-Thread $num done. \n";
return;}
if($max<$pack[$n]){$max=$pack[$n];}
say "Thread: $num \tStage: $stg \tMax: $max";
$n++;
sleep 1+int rand (3);
}
}
http://ru.stackoverflow.comでアカウントを開くことをお勧めします。このサイトは英語の質問のみのためです。 – Adriaan
スレッドの作業コード全体が 'lock($ shr)'が得られたブロックにあり、複数のスレッドが何らかの作業をするのを防ぎます。 – ikegami
ohh、神..ありがとう!) – QWD666