【问题标题】:Perl Threads - shared hash referencePerl 线程 - 共享哈希引用
【发布时间】:2013-12-05 17:35:06
【问题描述】:

在下面的代码(较大脚本的一部分)中,每次 $ref_h_report 的 2 次打印都会收到不同的结果,尽管脚本“有效”,即在两个子程序中都引用了相同的哈希。为什么打印会给出不同的结果?这会导致任何问题吗?

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;
}

}

【问题讨论】:

  • 总是use strict; use warnings; $ref_h_report 是字符串还是对哈希的引用?
  • @M42 $ref_h_report 是对从 share(%h_report) 返回的哈希的引用(参见上面的代码 sn-p)
  • 所以你必须使用:$ref_h_report->{'test'} = 'PASSED';。而且,要打印什么。您的脚本使用 use strict; use warnings; 引发错误
  • share后面没有%...
  • 请显示您的实际代码,复制并粘贴。这有几个错误。

标签: multithreading perl hash share


【解决方案1】:

Perl 线程用魔法实现共享变量。每个线程都将拥有自己的变量共享容器副本,并且对它的更改将传播到主副本。但是容器是分开的。

【讨论】:

  • 避免 chdir 问题的建议方法是什么?(原始代码太长无法发布,我已修复指出的 1 个错字),10x
  • 所以不要使用chdir
  • 或者不要使用线程。线程带来的问题往往比在 Perl 中解决的问题多,而且通常有更好的方法。
【解决方案2】:

我认为您可以从The Wide Finder Project 中获得灵感。 Sean O'Rourke 制作的 Results 中有很好的 solution。当键的数量远远大于并行化带来的好处时,它对您不起作用。它也可以被慢速 IO 杀死。

【讨论】:

    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2012-06-13
    相关资源
    最近更新 更多