佩尔。 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 这样的更高级别的模块,并且只在线程之间发送您实际需要的数据。
请帮助我解决 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 这样的更高级别的模块,并且只在线程之间发送您实际需要的数据。