这是我的代码。
代码有一些关于哈希共享的问题。
use strict;
use warnings;
use threads;
use threads::shared;
my %db;
share(%db);
my @threads;
sub test{
my $db_ref = $_[0];
my @arr = ('a','b');
push @{$db_ref->{'key'}}, \@arr;
}
foreach(1..2){
my $t = threads->new(
sub {
test(\%db);
}
);
push(@threads,$t);
}
foreach (@threads) {
$_->join;
}
错误代码。
Thread 1 terminated abnormally: Invalid value for shared scalar at test1.pl line 13.
Thread 2 terminated abnormally: Invalid value for shared scalar at test1.pl line 13.
我使用threads :: shared。
但我不知道什么是问题。
帮帮我PLZ~
答案 0 :(得分:1)
您只能将对共享对象的引用放入共享变量中。不会共享@arr
,也不会将引用推送到@arr
的数组。
替换
my @arr = ('a','b');
push @{$db_ref->{'key'}}, \@arr;
与
my @arr :shared = ('a','b');
lock %$db_ref;
# We can't use autovivification as we need a shared array.
$db_ref->{'key'} = shared_clone([]);
push @{$db_ref->{'key'}}, \@arr;
答案 1 :(得分:0)
我改变了代码。 但无法以散列(%db)保存所有数据。下一个代码是检查代码。
use strict;
use warnings;
use threads;
use threads::shared;
my %db;
share(%db);
my @threads;
sub test{
my $db_ref = $_[0];
my @arr :shared = ('a','b');
lock %$db_ref;
$db_ref->{'key'} = shared_clone([]);
push @{$db_ref->{'key'}}, \@arr;
}
foreach(1..5){
my $t = threads->new(
sub {
test(\%db);
}
);
push(@threads,$t);
}
foreach (@threads) {
$_->join;
}
while(my ($key, $val) = each %db){
print "$key => $val\n";
foreach my $value (@$val) {
foreach (@$value) {
print $_, " ";
}
print "\n";
}
}
%db中只有一个数据(a,b)。 我们还必须在%db中再添加一个数据。