aからeという名前の5つのファイルがあるとします。これらを並行して処理したいと思います。私はこのようなことをすることができると思いました:
my @ltrs = ('a'..'e');
for my $fnum (0..2) {
$pid = fork();
if ($pid) {
push(@childs, $pid);
}
elsif ($pid == 0) {
do {
my $ltr = shift(@ltrs);
print "Open file $ltr on $fnum\n";
} until (scalar(@ltrs)==0);
exit(0);
}
else {
die "Couldn't fork: $!\n";
}
}
foreach (@childs) {
waitpid($_, 0);
}
しかし、各子プロセスは次の5つの要素すべてにアクセスしています@ltrs
。
Open file a on 0
Open file b on 0
Open file c on 0
Open file d on 0
Open file e on 0
Open file a on 1
Open file b on 1
Open file c on 1
Open file d on 1
Open file e on 1
Open file a on 2
Open file b on 2
Open file c on 2
Open file d on 2
Open file e on 2
あるプロセスshift
が配列の要素である場合、次のプロセスが配列を調べるときにその要素がまだ存在するのはなぜですか?最初の後に、shift
次に来るプロセスはすべて、で始まる配列を見つけるb
と思いましたが、明らかに何かが欠けています。