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(),并且只使用了一个线程。