在下面的sub(导致错误的代码的简化版本)中,每个线程应该添加到主输出列表。在sub中,数组似乎正在填充,但是当我回到主调用部分时,它又是空的。我做错了什么?
#!/usr/bin/env perl
use threads;
use strict;
my $num_threads = 8;
my @threads = initThreads();
our @outputArray;
foreach(@threads){
$_ = threads->create(\&do_search);
}
foreach(@threads){
$_->join();
}
print "@outputArray";
sub initThreads{
# An array to place our threads in
my @initThreads;
for(my $i = 1;$i<=$num_threads+1;$i++){
push(@initThreads,$i);
}
return @initThreads;
}
sub do_search{
my $id = threads->tid();
push(@outputArray,$id);
threads->exit();
}
答案 0 :(得分:4)
根据threads::shared
documentation引用的@mpapec
默认情况下,变量对每个线程都是私有的,每个都是新的 创建的线程获取每个现有变量的私有副本。
所以解决方案是模块:
use threads::shared ;
our @outputArray :shared ;
您可以使用其他形式和许多限制,因此建议阅读整篇文档。