如何在Perl完成后清理线程?

时间:2011-11-30 11:28:23

标签: multithreading perl

我有一个Perl脚本,可以在验证某个表达式时启动线程。

while ($launcher == 1) {
    # do something
    push @threads, threads ->create(\&proxy, $parameters);
    push @threads, threads ->create(\&ping, $parameters);
    push @threads, threads ->create(\&dns, $parameters);
    # more threads
    foreach (@threads) {
    $_->join();
    }
}

第一个循环运行正常,但在第二个循环中,脚本退出时出现以下错误:

  

线程已经在launcher.pl第290行加入。   Perl退出活动线程:   1运行和未连接   0完成并且未加入   0运行和分离

我想我会清理@threads,但我怎么能这样做?我甚至不确定这是不是问题。

2 个答案:

答案 0 :(得分:5)

在循环结束时清除@threads

@threads = ();

或者更好的是,在循环开头用@threads声明my

while ($launcher == 1) {
    my @threads;

答案 1 :(得分:2)

最简单的解决方案是在while循环(while {my @threads; ...})内创建数组,除非你在其他地方需要它。否则,您可以在while循环结束时@threads = ()@threads = undef

您还可以在while循环之外设置变量my $next_thread;,然后在while循环中首先分配$next_thread = @threads并将foreach循环更改为

for my $index ($next_thread .. $#threads) {
    $threads[$index]->join();
}

或者跳过它,然后循环遍历最后三个添加的线程的片段

for (@threads[-3..-1) {
    $_->join();
}