2016-08-12 4 views
0

Это мой код.Код ошибки: «Тема 1 завершена ненормально: Недопустимое значение для общего скаляра в '

В коде есть проблема с хешем.

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. 

I waana Использование потоков :: общий.

Но я не знаю, в чем проблема.

помочь мне плз ~

ответ

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; 
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"; 
    } 
} 

Только данные (a, b) в% db. Нам нужно еще данные в% db.