我有一个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,但我怎么能这样做?我甚至不确定这是不是问题。
答案 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();
}