2010-09-13 14 views
8

Birden çok iş parçacığı üzerinde çok boyutlu bir karma paylaşmaya çalışıyorum. Bu karma 2 bağlı anahtar çifti tutar, zaten bağlı olup olmadıklarını bilmem gerek, eğer değilse, onları bağladım, yoksa veritabanına gitmeye gerek yok.Perl: Paylaşılan çok boyutlu karma ile iş parçacığı

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

Ben çizgi Bu görünüşte sadece paylaşılan yapının tek seviyesini paylaşmasına izin paylaşılan :: perl parçacığı ile ilgisi var
if(not defined $FLUobject2param{$objectID}{$paramID}){

hatayı Invalid value for shared scalar alıyorum.

Bu kombinasyonun birden çok iş parçacığı üzerinde zaten kullanılmış olup olmadığını nasıl kontrol edebilirim?

cevap

8

Otomatikleştirme, arkadaşınızın çoğu zaman, ancak paylaşılan değerler ile bu konuda dikkatli olmalısınız. handlethread değiştirin:

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

Bunun nedeni ise do documented limitation:

Ortak değişkenler olabilir sadece mağaza skalerler,

kod yukarıda paylaşılan değişkenler veya paylaşılan verilerin refs ref ... Henüz mevcut değil ise, $FLUobject2param{$objectID} no'lu boş bir karma referansı üretecek olan otomatik değiştirme işleminden kaçınmak için karma tuşları ayrı ayrı kontrol eder.

Şartlı koşulda, önce uygun iskeleyi kurarız ve sonra değeri atarız. Yine, otomatikleştirme bunu sizin için yapar, ancak paylaşım bizi daha bilinçli olmaya zorlar.

İlgili konular