【发布时间】:2021-10-24 16:53:53
【问题描述】:
以下this问题,我面临以下问题:
当我想在几个线程中循环一些哈希并更新它们时,我收到以下错误:
Thread .. terminated abnormally: Invalid value for shared scalar at ...
这是代码:
use feature qw(say);
use strict;
use warnings;
use threads ;
use threads::shared ;
use Data::Dumper qw(Dumper);
my %h1 = (a => 1, b => 2);
my %h2 = (c => 3, d => 4);
my $a1 = \%h1;
my $b1 = \%h2;
my $a1c = shared_clone($a1);
my $b1c = shared_clone($b1);
my $lockvar:shared;
my $nthreads = 3;
for ( 1..$nthreads ) {
threads->create('job_to_parallelize', $a1c, $b1c, \$lockvar ) ;
}
$_->join() for threads->list();
sub job_to_parallelize {
my ($a1, $b1, $lockvar) = @_;
{
lock $lockvar;
$a1->{a}++;
$b1->{d}++;
$a1->{scalar}{10} = 1;
}
}
print Dumper($a1c);
print Dumper($b1c);
据我了解,这是因为在我克隆之前不存在“标量”。 知道如何解决这个问题吗? (即允许我在克隆结构上声明内部线程)。
【问题讨论】:
-
感谢自动生存,
$a1->{scalar}{10} = 1等同于( ( $a1 //= {} )->{scalar} //= {} )->{10} = 1。这意味着$a1->{scalar}{10} = 1创建了一个新的(非共享的)散列分配给$a1->{scalar}。
标签: multithreading perl clone