错误代码是'线程1异常终止:共享标量的值无效'

时间:2016-08-12 19:55:11

标签: multithreading perl shared

这是我的代码。

代码有一些关于哈希共享的问题。

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~

2 个答案:

答案 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中再添加一个数据。