2016-08-12 1 views
0

Ceci est mon code.Le code d'erreur est 'Thread 1 terminé anormalement: Valeur invalide pour scalaire partagé à'

le code rencontre un problème de hash partagé.

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

code d'erreur.

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. 

Je me suis servi de threads :: shared.

Mais je ne sais pas quel est le problème.

aide-moi plz ~

Répondre

1

Vous ne pouvez placer des références à des objets partagés dans vars partagés. @arr n'est pas partagé, et le tableau sur lequel vous placez une référence à @arr n'est pas non plus partagé.

Remplacer

my @arr = ('a','b'); 
push @{$db_ref->{'key'}}, \@arr; 

avec

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

I Code changé. Mais impossible d'enregistrer toutes les données dans le hachage (% db). Le code suivant est le code de vérification.

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

Une seule donnée (a, b) dans% db. Nous devons encore une donnée en% db.