我试图使用线程来解析两种不同类型的文件。子程序根本不共享任何数据。
# 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_xml_template
函数尝试访问数组@TemplateParser::array
时出现问题。此时数组没有数据,但它在parse_template
函数内填充。我错过了什么吗?
答案 0 :(得分:1)
您尝试跨线程共享数据而不共享它。您需要在变量上使用: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();