2016-08-12 4 views
0

Dies ist mein Code.Fehlercode ist 'Thread 1 beendet abnormal: Ungültiger Wert für Shared-Skalar um'

der Code hat ein Problem mit Hash-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; 
} 

Fehlercode.

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. 

Ich waana mit threads :: shared.

Aber ich weiß nicht, was das Problem ist.

mir helfen plz ~

Antwort

1

Sie können nur Verweise auf gemeinsam genutzte Objekte in einem gemeinsamen Vars platzieren. @arr ist nicht freigegeben, und das Array, auf das Sie einen Verweis auf @arr schieben, ist auch nicht freigegeben. Ersetzen

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

mit

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

Ich änderte Code. Aber kann nicht alle Daten im Hash (% db) speichern. Nächster Code ist der Prüfcode.

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

Nur eine Daten (a, b) in% db. Wir müssen noch eine Daten in% db.

Verwandte Themen