佩尔。 2 个文件中的共享哈希线程

Perl. shared hash threads in 2 files

请帮助我解决 2 个文件中共享哈希线程的问题

我的第一个文件“H.pl”包含定义的散列(非常大,有很多级别):

#!usr/bin/perl
use strict;
use warnings;
our %h;
%h= (
        "hd",
                {
                    "0",    {"type",    "fix",  "ln",   "8",    "descr",    "P"},
                    "1",    {"type",    "hex",  "ln",   "2",    "descr",    "H"},
                },
        "hdr",
                {
                    "0",    {"type",    "fix",  "ln",   "8",    "descr",    "E"},
                },
    );

第二个文件“V.pl”包含更改散列的主要代码和线程:

#!usr/bin/perl

use strict;
use warnings;
use threads;
use threads::shared;
use Data::Dumper;
use lib '.';

require 'H.pl';

our %h;
threads->create(sub{  
                    
                    print "befor change in threads \n";
                    print Dumper \%h;  
                    
                    $h{"hd"}{"0"}{"value"}  = "hello"; 
                    $h{"hd"}{"0"}{"descr"}  = "R"; 
                    $h{"hdr"}{"0"}{"value"}  = "hello"; 
                    
                    print "after change in threads  \n";
                    print Dumper \%h;  
                    
                    }
                );

sleep 1;

print "without threads  \n";
print Dumper \%h;  

我尝试在两个文件中使用 our %h:shared;,但总是出现错误 Invalid value for shared scalar at H.pl 我如何分享我的哈希值?

感谢帮助

根据文档:

Shared variables can only store scalars, refs of shared variables, or refs of shared data (discussed in next section):

如果你想分享一个不浅的散列,你需要先分享内部引用。

您可以为此使用 shared_clone 函数。将以下行添加到 our %h 下面的 V.pl 使程序运行:

%h = %{ shared_clone(\%h) };

此外,将 create 的结果存储到变量 $t 而不是 sleep、运行 $t->join.

通常最好使用像 Thread::Queue 这样的更高级别的模块,并且只在线程之间发送您实际需要的数据。