Tom Christiansenのサンプルコード(àlaperlthrtut)は、3から1000までのすべての素数を検索して出力する再帰的なスレッド実装です。
以下は、スクリプトの穏やかに適応されたバージョンです
#!/usr/bin/perl
# adapted from prime-pthread, courtesy of Tom Christiansen
use strict;
use warnings;
use threads;
use Thread::Queue;
sub check_prime {
my ($upstream,$cur_prime) = @_;
my $child;
my $downstream = Thread::Queue->new;
while (my $num = $upstream->dequeue) {
next unless ($num % $cur_prime);
if ($child) {
$downstream->enqueue($num);
} else {
$child = threads->create(\&check_prime, $downstream, $num);
if ($child) {
print "This is thread ",$child->tid,". Found prime: $num\n";
} else {
warn "Sorry. Ran out of threads.\n";
last;
}
}
}
if ($child) {
$downstream->enqueue(undef);
$child->join;
}
}
my $stream = Thread::Queue->new(3..shift,undef);
check_prime($stream,2);
Sorry. Ran out of threads
私のマシン(ActiveStateとWin32の下)で実行すると、コードは' '警告で終了する前に118スレッド(最後の素数が見つかった:653)しか生成できませんでした。
作成できるスレッドの数が制限されている理由を理解するために、use threads;
行を。に置き換えましたuse threads (stack_size => 1);
。結果として得られたコードは、2000以上のスレッドをうまく処理しました。
誰かがこの振る舞いを説明できますか?