0

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 つのスレッドが作成されますか?

$maxThreads2 としましょう。2 つのスレッドを実行し、2 つのスレッドが完了すると、強制終了され、さらに 2 つのスレッドが実行されます。最後に、実行中の2つのスレッドに参加するか待機するだけですか?

編集:これらのスレッドの戻り値も気にしません。そのため、リソースを解放したいと考えています。参加する唯一の理由は、スクリプトを続行する前にすべてのスレッドを完了させたいからです。繰り返しますが、これは最良の実装ですか?

4

1 に答える 1

3

スレッドを終了する通常の方法は、適切な戻り値でエントリ ポイント関数から EXPR を返すことです。

結合関数はこの戻り値を待ち、スレッドをクリーンアップします。したがって、私の意見では、あなたのコードは問題ありません。

スレッドを終了する別の方法は次のとおりです。

threads->exit(status);

また、次のコマンドを使用して、結合可能なスレッドのリストを取得できます。

threads->list(threads::joinable);
于 2013-08-05T09:41:35.000 に答える