2012-12-05 18 views
5

उदाहरण के लिए, तरीके:रूबी क्लास विधियां थ्रेड-सुरक्षित हैं? जैसे

class MyClass 
    self.perform(id) 
    hash = doSomething(id) 
    doMoreStuff(hash) 
    return hash 
    end 
end 

मेरी चिंता का विषय है, तो मैं कई MyClass.perform() बुला धागे है। क्या ऑब्जेक्ट hash संभावित रूप से किसी अन्य थ्रेड द्वारा ओवरराइट किया जा सकता है? दूसरे शब्दों में, थ्रेड 1 doSomething पर कॉल करता है और {1 => 1} का हैश वापस लौटाता है। लेकिन बाद में थ्रेड 2 doSomething पर कॉल करता है और {2 => 2} का हैश प्राप्त करता है। अब क्या हुआ? क्या थ्रेड 1 हैश बदल गया है {2 => 2}?

या प्रत्येक थ्रेड अपने hash पर काम करता है जिसे कभी अन्य धागे से छुआ नहीं जा सकता है? मान लें doSomething और doMoreStuff पहले से ही थ्रेड-सुरक्षित हैं।

यदि यह महत्वपूर्ण है, तो मैं रेल 3.0 का उपयोग कर रहा हूं।

+0

जहां तक ​​मुझे पता है, रेल के साथ, उदाहरण के लिए, वे – macool

+0

नहीं हैं क्या आप समझ सकते हैं कि विधि के बारे में आपके पास क्या थ्रेड-सुरक्षा चिंताएं हैं? –

+1

इसके अलावा, विधि के अंत में 'वापसी' की कोई आवश्यकता नहीं है। यदि आपके पास अंतिम पंक्ति पर 'हैश' है, तो वह वापसी मूल्य होगा। –

उत्तर

16

स्थानीय चर, जैसे कि hash, आसपास के विधि के विशेष आमंत्रण के लिए स्थानीय हैं। यदि दो धागे एक ही समय में perform पर कॉल करते हैं, तो प्रत्येक कॉल को अपना निष्पादन संदर्भ प्राप्त होगा और जब तक साझा संसाधन शामिल नहीं होते हैं तब तक वे ओवरलैप नहीं होंगे: उदाहरण चर (@hash), कक्षा चर (@@hash), ग्लोबल्स ($hash) , ... समवर्ती समस्याओं का कारण बन सकता है। अपने perform जैसे कुछ सरल के साथ थ्रेड-वार के बारे में चिंता करने की कोई बात नहीं है।

हालांकि, perform धागे बना रहा था और आप perform के अंदर बंद होने के साथ समाप्त हो गए, तो आप बंद होने के माध्यम से कब्जे वाले स्थानीय चर के संदर्भ में कई धागे के साथ समाप्त हो सकते हैं। इसलिए जब आप धागे बनाते हैं तो आपको स्कोप समस्याओं के बारे में सावधान रहना होगा, लेकिन स्थानीय तरीकों के साथ काम करने वाले सरल तरीकों से निपटने के दौरान आपको इसके बारे में चिंता करने की ज़रूरत नहीं है।

1

कुछ "क्लास विधि" (जो क्लास ऑब्जेक्ट पर केवल एक सिंगलटन विधि है) होने के कारण यह एक उदाहरण विधि होने से कहीं अधिक थ्रेड-सुरक्षित नहीं बनाता है।

+1

@Downvoter जब उत्तर लिखा गया था, सवाल वास्तव में अस्पष्ट था, और मैं इससे अधिक जानकारी प्रदान नहीं कर सका। मैं अभी भी यह स्पष्ट करने की कोशिश कर रहा हूं कि ओपी क्या पूछ रहा है, इसलिए कृपया इस उत्तर को कम मत करें। –

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