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

时间:2013-08-09 10:46:07

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

1 个答案:

答案 0 :(得分:1)

您尝试跨线程共享数据而不共享它。您需要在变量上使用:sharedshare()

如果你要避免全局变量,你就不会遇到这个问题。

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();