2010-02-16 6 views
1

Je vais écouter sur un port (serveur simple) quand une demande est passée analyser l'URL et commencer un fil.Pourquoi ne puis-je pas voir les éléments d'une file d'attente partagée depuis mon thread Perl?

Le thread va insérer un élément dans une file d'attente partagée et il est verrouillé pendant l'insertion.

Je ne suis pas en mesure d'obtenir l'élément lorsque j'appelle coup d'oeil sur la file d'attente.

use Thread qw(async); 
use Thread::Queue; 

my $DataQueue:shared = new Thread::Queue; 

$newElement = init($user,$param,$reqest); # init is method in ElementStructure.pm 
#after creating the element it is passes to subroutine where thread is started 

sub updateData 
{ 
    my $iElement=shift; 

    $thr = async 
    { 

     { 
      lock($DQueue); 

      print "---->locked\n"; 
        $DQueue->enqueue($iElement); 
      insertdata(); 

     } 

     print "lock released\n"; 

    }; 
} 

sub insertdata 
{ 
    my $count=0; 
    while ($DataElement = $DQueue->peek($count)) 
    { 
    print "-- position $count\n"; 
    $count++; 
    } 
} 
+0

ce qui ne "pas en mesure" signifie? ce qui se produit? – ysth

+0

avez-vous une raison d'utiliser 'Thread' au lieu des' threads 'plus modernes? –

+0

Veuillez reformuler votre question pour indiquer ce qui se passe réellement et ce que vous attendez à la place, de préférence avec un exemple de sortie indiquant le résultat. – Ether

Répondre

2

Le problème est peut-être que vous utilisez $ DataQueue une place mais $ DQueue ailleurs? Assurez-vous que vous utilisez strict et avertissements.

Si $ IElement peut être fausse (par exemple 0), vous devez dire

while (defined (my $DataElement = $DQueue->peek($count))) 

Correction du nom de variable et mettre en code pour appeler updateData, tout semblait fonctionner pour moi.

+0

En outre, la file d'attente gère elle-même son verrouillage, ce qui entraîne un risque d'interblocage en ajoutant un verrouillage supplémentaire. – weismat

+1

@weismat: Thread :: Queue supporte explicitement ce type de verrouillage pour couvrir plusieurs opérations sur la file d'attente avec un verrou, au moins par doc. – ysth

0

Voici la réponse

use Thread qw(async); 
use Thread::Queue; 

my $DataQueue:shared = new Thread::Queue; 

$newElement = init($user,$param,$reqest); # init is method in ElementStructure.pm 
#after creating the element it is passes to subroutine where thread is started 

my $th=new Thread(\&updateData); 
$th->join(); 

sub updateData 
{ 

     { 
      lock($DQueue); 

      print "---->locked\n"; 
        $DQueue->enqueue($newElement); 
      insertdata(); 

     } 

     print "lock released\n"; 

} 

sub insertdata 
{ 
    my $count=0; 
    while ($DataElement = $DQueue->peek($count)) 
    { 
    print "-- position $count\n"; 
    $count++; 
    } 
} 
Questions connexes