2013-08-05 1683 views
0

Perl对完成其任务的线程做了什么?它是否让它闲置或只是杀死它?下面我有一个基本的代码结构,我想知道如何最优化它。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个线程。最后它只会加入或等待这两个线程在运行?

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

+0

请叫它'Perl',不'PERL'或'perl'至少'珍珠' – 2013-08-05 08:43:38

+0

对不起,现在我知道了。你能回答我的问题吗? – kotsumu

回答

3

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

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

另一种方式来退出一个线程是这样的:

threads->exit(status); 

此外,您还可以得到可连接线程的列表,包括:

threads->list(threads::joinable); 
+0

谢谢,我对此感到不确定。我知道退出线程,但我不知道是否需要在线程结束时(因为它现在正在工作,我还没有压力测试它,很快)。 – kotsumu