Multithreading Perl线程-共享哈希引用
在下面的代码(较大脚本的一部分)中,尽管脚本“有效”,即在两个子脚本中引用相同的哈希,但每次打印$ref_h_报告时都会收到不同的结果。为什么打印结果不同?这会引起什么问题吗Multithreading Perl线程-共享哈希引用,multithreading,perl,hash,share,Multithreading,Perl,Hash,Share,在下面的代码(较大脚本的一部分)中,尽管脚本“有效”,即在两个子脚本中引用相同的哈希,但每次打印$ref_h_报告时都会收到不同的结果。为什么打印结果不同?这会引起什么问题吗 use threads; use threads::shared; my %h_report; my $ref_h_report = share(%h_report); $thr=threads->create(\&run_test) $thr->join(); &merge_report;
use threads;
use threads::shared;
my %h_report;
my $ref_h_report = share(%h_report);
$thr=threads->create(\&run_test)
$thr->join();
&merge_report;
sub run_test {
.....
$ref_h_report{'test'} = 'PASSED';
print "reference=%0d\n", $ref_h_report;
.....
}
sub merge {
if($ref_h_report{'test'} eq 'PASSED')
print "reference=%0d\n", $ref_h_report;
}
}
我想你可以从中得到灵感。这是肖恩·奥洛克的杰作。当键的数量远远大于并行化带来的好处时,它就不适用于您。它也可能被缓慢的IO杀死。Perl线程使用magic实现共享变量。每个线程都有自己的变量共享容器副本,对它的更改将传播到主副本。但是容器是分开的。始终
严格使用;使用警告
是$ref_h_report
字符串还是对哈希的引用?@M42$ref_h_report是对从共享(%h_report)返回的哈希的引用(请参阅上面的代码片段),因此您必须使用:$ref_h_report->{test}='PASSED'代码>。还有,你想打印什么。脚本使用use strict抛出错误;使用警告代码>共享后没有%
…请显示您的实际代码,并复制粘贴。这有几个错误。建议如何避免chdir问题?(原始代码太长,无法发布,我修复了一个被指出的打字错误),10X不要使用chdir
。或者不要使用线程。线程通常会引入比Perl更多的问题,通常有更好的方法。