2014-10-06 10 views
6

यह मैं threads::shared वर्णन से पढ़ साझा:पर्ल चर atomicity और दृश्यता

डिफ़ॉल्ट रूप से, चर प्रत्येक थ्रेड के लिए निजी हैं, और प्रत्येक नव निर्मित धागे प्रत्येक मौजूदा चर की एक निजी प्रतिलिपि हो जाता है। यह मॉड्यूल आपको अलग धागे भर में चर साझा करने के लिए अनुमति देता है ... (more)

चलो कहते हैं कि मैं इस तरह एक साझा चर करते हैं:

my $var :shared; 
$var = 10; 

इसका मतलब यह है चर के लिए सभी धागे मैं बनाने के लिए केवल एक बार ही मौजूद है ।


अब atomicity और दृश्यता के बारे में:

thread_A प्रदान करती है, तो एक नया मान मान लीजिए कि 11 करते हैं:

$var = 11; 

यह गारंटी है कि thread_B (और अन्य सभी धागे मैं बनाया है हो सकता है) मूल्य 11 देखेंगे? और क्या असाइनमेंट परमाणु प्रदर्शन किया जाता है?

या क्या हमें लॉक प्राप्त करने के लिए पहले जावा में पसंद है और फिर असाइनमेंट करें और लॉक को रिलीज़ करें। और एक ही लॉक का उपयोग करने वाले धागे को अद्यतन मूल्य देखने की गारंटी है?

या यह जावा में अस्थिर आदिम चर की तरह व्यवहार करता है?

उत्तर

4

अपडेट में परमाणु को लागू करने के लिए हमेशा अच्छा अभ्यास है। हमें यह करने की अनुमति देने के लिए पर्ल lock प्रदान करता है। आप चरम पर lock कर सकते हैं - यदि चर धागे के साथ साझा किया जाता है, तो लॉक स्थिति भी है।

यदि आप $var अपडेट करते हैं तो अन्य थ्रेड नए मान को देखेंगे।

लेकिन जब आप इसे एक्सेस करते हैं, तो आपके पास संभावित दौड़ की स्थिति होती है। यदि यह एक समस्या है - lock और यदि यह नहीं है ... आगे बढ़ें।

ध्यान रखें कि $var++ जैसे ऑपरेशन परमाणु होने की गारंटी नहीं है। (http://perldoc.perl.org/perlthrtut.html#Thread-Pitfalls%3a-Races)

संबंधित मुद्दे