Perl threads :: shared用于嵌套数据结构

时间:2015-02-17 17:53:26

标签: multithreading perl hash

# thread::shared only allws a single level of shared structure
# needs a explicit hash creation for nested data structures
my %counts     : shared = ();

foreach my $state (%known_states) {
    # COUNTS
    unless (exists $counts{build}) {
        my %cb : shared;
        $counts{build} = \%cb;
    }
    $counts{build}{$state} = 0;

}

现在,我必须做类似上面的事情,我必须为每个子级别哈希显式创建哈希引用。

有更好的方法吗?

P.S。如果我没有创建哈希引用,那么我得到共享标量的#34;无效值"错误,因为我试图将它用作哈希。

1 个答案:

答案 0 :(得分:5)

自动生成

$counts{build}{$state} = 0;

表现得像

( $counts{build} //= {} )->{$state} = 0;

为了便于阅读,让它分为两行

$counts{build} //= {};
$counts{build}{$state} = 0;

但就像你说的那样,我们需要一个共享哈希。

$counts{build} //= &share({});
$counts{build}{$state} = 0;

您可以添加以下内容以确保不会意外地生成非共享变量:

no autovivification qw( fetch store exists delete );