2010-09-13 15 views
8

के साथ थ्रेडिंग मैं एकाधिक धागे पर एक बहु-आयामी हैश साझा करने की कोशिश कर रहा हूं। इस हैश में 2 कनेक्टेड की-जोड़े हैं, मुझे यह जानने की ज़रूरत है कि वे पहले से जुड़े हैं या नहीं, अगर वे नहीं हैं, तो मुझे कनेक्ट करने की ज़रूरत है, अगर नहीं, तो डेटाबेस में जाने की कोई आवश्यकता नहीं है।पर्ल: साझा बहु-आयामी हैश

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

मैं लाइन
if(not defined $FLUobject2param{$objectID}{$paramID}){

जाहिरा तौर पर पर्ल के थ्रेड :: केवल आप साझा संरचना की एक एकल स्तर साझा करने की अनुमति साझा के साथ क्या करना है पर त्रुटि Invalid value for shared scalar मिलती रहती है।

मैं अभी भी यह जांचने में सक्षम कैसे होगा कि यह संयोजन पहले से ही एकाधिक धागे पर उपयोग किया जा रहा है या नहीं?

उत्तर

8

ऑटोविविफिकेशन आपके मित्र का अधिकांश समय है, लेकिन आपको साझा मूल्यों के बारे में सावधान रहना होगा। handlethread संशोधित करें:

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

इस वजह से है कर एक documented limitation:

साझा चर केवल दुकान scalars, साझा चर, या साझा किए गए डेटा की refs की refs ...

कोड ऊपर ऑटोविविफिकेशन से बचने के लिए हैश कुंजी को अलग से जांचता है, जो $FLUobject2param{$objectID} में एक अनछुए खाली हैश संदर्भ लगाएगा यदि यह अभी तक मौजूद नहीं है।

सशर्त के अंदर, हम पहले उपयुक्त मचान बनाते हैं और फिर मूल्य आवंटित करते हैं। दोबारा, ऑटोविविफिकेशन आम तौर पर आपके लिए इसे संभालता है, लेकिन साझा करना हमें अधिक जानबूझकर होने के लिए मजबूर करता है।