2016-08-12 7 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. 

나는 스레드를 사용 : 공유 waana.

그러나 문제는 무엇인지 알지 못합니다.

도움 나 PLZ ~

답변

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

% db에 하나의 데이터 (a, b) 만 있습니다. % db에 하나 이상의 데이터가 있어야합니다.