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();
}

在这种情况下,一旦线程完成,我想释放资源以供更多线程运行。我担心在循环结束时加入线程。如果在整个程序生命周期中会创建@threads4个线程,加入时还会有4个线程吗?

假设$maxThreads是 2,它会运行 2 个线程,然后当这 2 个线程完成时,它将被杀死并再运行 2 个线程。最后它只会加入或等待这两个线程运行吗?

编辑:我也不关心这些线程的返回值,这就是我想释放资源的原因。我加入的唯一原因是我希望在继续执行脚本之前完成所有线程。同样,这是最好的实现吗?

4

1 回答 1

3

终止线程的常用方法是从入口点函数返回 EXPR 并带有适当的返回值。

join 函数等待这个返回值,并清理线程。所以,在我看来,你的代码很好。

退出线程的另一种方法是:

threads->exit(status);

此外,您可以通过以下方式获取可连接线程的列表:

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