0

2 つの異なる種類のファイルを解析するためにスレッドを使用しようとしていました。サブルーチンはデータをまったく共有しません。

# 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

共有せずにスレッド間でデータを共有しようとしています。変数に対して:sharedorを使用する必要があります。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。)

もちろん、2 つあれば十分なスレッドが 2 つ (合計 3 つ) 作成されます。代わりに、次を使用できます。

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 に答える