Perl はタスクを完了したスレッドに対して正確に何をしますか? それはそれをアイドル状態にしますか、それとも単に殺しますか? 以下の基本的なコード構造があり、それを最適化する方法を考えていました。
use threads;
use Thread::Semaphore
my $s = Thread::Semaphore->new($maxThreads);
my @threads;
my $thread;
foreach my $tasktodo (@tasktodo) {
$s->down();
$thread = threads->new(\&doThis);
push @threads, $thread;
}
foreach my $thr (@threads) {
$thr->join();
}
sub doThis {
# blah blah
# completed, gonna let more threads run with $s->up()
$s->up();
}
この場合、スレッドが完了したら、より多くのスレッドを実行するためにリソースを解放したいと考えています。ループの最後でスレッドを結合するのが心配です。プログラムのライフ サイクル全体で 4 つのスレッドが作成さ@threads
れる場合、結合時にも 4 つのスレッドが作成されますか?
$maxThreads
2 としましょう。2 つのスレッドを実行し、2 つのスレッドが完了すると、強制終了され、さらに 2 つのスレッドが実行されます。最後に、実行中の2つのスレッドに参加するか待機するだけですか?
編集:これらのスレッドの戻り値も気にしません。そのため、リソースを解放したいと考えています。参加する唯一の理由は、スクリプトを続行する前にすべてのスレッドを完了させたいからです。繰り返しますが、これは最良の実装ですか?