Multithreading 在perl中线程退出时数组被破坏

Multithreading 在perl中线程退出时数组被破坏,multithreading,perl,Multithreading,Perl,我试图使用线程来解析两种不同类型的文件。这些子例程根本不共享任何数据 # Parse header files $hdr_thrd = threads -> create(\&Parser::parse_header_file, $path); # Parse input template files $tmplt_thrd = threads -> create(\&TemplateParser::parse_template); # Join the

我试图使用线程来解析两种不同类型的文件。这些子例程根本不共享任何数据

# Parse header files
 $hdr_thrd = threads -> create(\&Parser::parse_header_file, $path);

 # Parse input template files
 $tmplt_thrd = threads -> create(\&TemplateParser::parse_template);

 # Join the threads
 $tmplt_thrd -> join();
 $hdr_thrd -> join();

 # This uses the data obtained from the above two threads
 &Parser::parse_xml_template();

parse\u xml\u template
函数尝试访问数组
@TemplateParser::array
时,就会出现问题。数组此时没有数据,但正在
parse_模板
函数中填充。我遗漏了什么吗?

您试图跨线程共享数据而不共享数据。您需要在变量上使用
:shared
share()

如果你应该避免使用全局变量,你就不会有这个问题

sub parse_template {
   my @tmplt_result;
   ...
   return \@tmplt_result;
}

my $hdr_thrd   = threads->create(\&Parser::parse_header_file, $path);
my $tmplt_thrd = threads->create(\&TemplateParser::parse_template);

my $tmplt_result = $tmplt_thrd->join();
my $hdr_result   = $hdr_thrd->join();
(通过
join
返回值时,不需要显式共享)

当然,这不必要地创建了两个线程(总共三个),而两个线程就足够了。相反,您可以使用:

sub parse_template {
   my @tmplt_result;
   ...
   return \@tmplt_result;
}

my $hdr_thrd = threads->create(\&Parser::parse_header_file, $path);
my $tmplt_result = TemplateParser::parse_template();
my $hdr_result = $hdr_thrd->join();

为什么只需要两个线程就创建两个线程(总共三个)?不,阵列不共享,我只创建两个线程($tmplt_thrd和$hdr_thrd)。我没有得到“总共三个”?数组已经是一个包范围的变量。应该分享吗?如果我试图将其声明为
@TemplateParser::array:shared我得到一个编译时错误。是的,因为您想在主线程和
$tmplt\u thrd
之间共享它。嗯,错在哪里?您需要使用
use threads::shared@TemplateParser::array
不是一个声明<代码>我的@数组:共享。如果您试图跨包访问它,
our@array:shared
可能执行或
共享(@TemplateParser::array)否则。我不确定,因为我从未尝试过,因为这是一件可怕的事情!我从第二条评论和答案的组合中得到了答案。实际上并没有使它成为一个局部变量,而是向它添加了share(),并且只使用了一个线程。