Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Perl线程-共享哈希引用_Multithreading_Perl_Hash_Share - Fatal编程技术网

Multithreading Perl线程-共享哈希引用

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;

在下面的代码(较大脚本的一部分)中,尽管脚本“有效”,即在两个子脚本中引用相同的哈希,但每次打印$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;

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更多的问题,通常有更好的方法。