0

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

# 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函数内部填充。我错过了什么吗?

4

1 回答 1

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();
于 2013-08-09T13:07:10.973 回答