2010-09-13 11 views
8

J'essaie de partager un hachage multidimensionnel sur plusieurs threads. Ce hachage contient 2 paires de clés connectées, j'ai besoin de savoir si elles sont déjà connectées, si ce n'est pas le cas, j'ai besoin de les connecter, sinon, il n'y a pas besoin d'aller à la base de données.Perl: Filetage avec hachage multidimensionnel partagé

use threads; 
use threads::shared; 

my %FLUobject2param : shared =(); 

#Start a new thread for every available processor 
for (my $i=0;$i<$PROCESSORS;$i++) { 
    threads->new(\&handlethread); 
} 
#Catch if these threads end 
foreach my $onthr (threads->list()) { 
    $onthr->join(); 
} 

sub handlethread{ 
    ... 
    if(not defined $FLUobject2param{$objectID}{$paramID}){ 
     $dbh->getObject2Param($objectID,$paramID); 
     $FLUobject2param{$objectID}{$paramID} = 1; 
    } 
} 

Je continue à obtenir l'erreur Invalid value for shared scalar sur la ligne
if(not defined $FLUobject2param{$objectID}{$paramID}){

Cela a apparemment à voir avec les fils de Perl :: mutualisé ne vous permettant de partager un seul niveau de la structure commune.

Comment serais-je toujours en mesure de vérifier si cette combinaison est déjà utilisée sur plusieurs threads?

Répondre

8

Autovivification est votre ami la plupart du temps, mais vous devez faire attention avec des valeurs partagées. Modifier handlethread:

sub handlethread{ 
    # ... 
    unless (exists $FLUobject2param{$objectID} && 
      exists $FLUobject2param{$objectID}{$paramID}) 
    { 
     $dbh->getObject2Param($objectID,$paramID); 
     $FLUobject2param{$objectID} = &share({}); 
     $FLUobject2param{$objectID}{$paramID} = 1; 
    } 
} 

Cela est dû faire une documented limitation:

Les variables partagées ne pouvez scalaires stocker, refs des variables partagées ou refs de données partagées ...

Le code ci-dessus vérifie les clés de hachage séparément pour éviter l'autovivification, qui plante une référence de hachage vide non partagée au $FLUobject2param{$objectID} si elle n'existe pas encore. A l'intérieur du conditionnel, nous construisons d'abord l'échafaudage approprié, puis assignons la valeur. Encore une fois, l'autovivification gère habituellement cela pour vous, mais le partage nous oblige à être plus délibéré.