2012-06-27 11 views
7

सी # और जावा में पिछले काम से, मैं इस तरह के रूप में एक बयान के आदी हूँ यह नहीं किया जा रहा धागा सुरक्षित:रूबी धागे लिखने पर टकरा नहीं सकते हैं?

x += y; 

हालांकि, मैं धागे के बीच किसी भी टकराव का पालन करने के लिए जब ऊपर कोड चल नहीं कर पाए हैं रूबी के साथ समानांतर में।

मैंने Ruby automatically prevents multiple threads from writing to the same data concurrently पढ़ा है। क्या ये सच है? += ऑपरेटर इसलिए रुबी में थ्रेड-सुरक्षित है?

उत्तर

2

अच्छा, यह आपके कार्यान्वयन और बहुत सी चीजों पर निर्भर करता है। एमआरआई में, जीवीएल (विशालकाय वीएम लॉक) जैसी कोई चीज है जो नियंत्रित करती है कि कौन सा धागा वास्तव में एक समय में कोड निष्पादित कर रहा है। आप देखते हैं, एमआरआई में, केवल एक थ्रेड एक समय में रूबी कोड निष्पादित कर सकता है। इसलिए जब सी लाइब्रेरी नीचे एक और थ्रेड चला सकते हैं, जबकि वे सी कोड में सीपीयू का उपयोग विशाल संख्याओं को गुणा करने के लिए करते हैं, तो कोड स्वयं एक ही समय में निष्पादित नहीं कर सकता है। इसका मतलब है कि असाइनमेंट जैसे एक कथन एक ही समय में एक असाइनमेंट के रूप में नहीं चल सकता है (हालांकि जोड़ समानांतर में चल सकते हैं)। दूसरी चीज जो हो सकती है यह है: मुझे लगता है कि मैंने सुना है कि int एस के लिए असाइनमेंट लिनक्स पर परमाणु हैं, इसलिए यदि आप लिनक्स पर हैं, तो यह कुछ भी हो सकता है।

+0

कोई विचार अगर जीआईएल को कभी भी 'x + = y' निष्पादित करने के बीच में धागे के लिए गिरा दिया जाएगा? या क्या यह कभी भी अधिग्रहण और _statement_ सीमाओं पर जारी किया गया है? या उच्च स्तरीय सीमाएं? – sarnold

+0

सामान्य रूप से धागे के उत्तर का एक बहुत ही विवरण http://stackoverflow.com/questions/56087/does-ruby-have-real-multithreading पर पाया जा सकता है। – Chris

+0

@ कर्नाल्ड: जीवीएम की रिहाई सभी अंडरलिंग सी कोड पर निर्भर करती है। उदाहरण के लिए, 'बिग्नम' गुणा के कार्यान्वयन में, यदि संख्या किसी निश्चित आकार के बाहर हैं, तो जीवीएल जारी किया जाएगा ताकि अन्य * रूबी * कोड निष्पादित हो सके जबकि सी गुणों को गुणित करता है। यदि आप सी एक्सटेंशन विकसित करते हैं तो जीवीएल केवल आपके लिए चिंता का विषय है। – Linuxios

0
x += 1 

x = x + 1 

इस अंकन में (यदि आप + को फिर से परिभाषित है, तो आप भी अपने आप += का परिणाम को फिर से परिभाषित), यह स्पष्ट है यह नहीं है करने के लिए हर तरह से बराबर है एक परमाणु ऑपरेशन, और इसलिए थ्रेड-सुरक्षित की गारंटी नहीं है।

+0

मैं समझता हूं कि '+ =' '' 'ऑपरेटर का उपयोग करता है। मुझे लगता है कि मुझे अपने प्रश्न को केवल पूर्णांक जोड़ने के लिए सीमित कर देना चाहिए था, क्योंकि यही वह मामला है जो मुझे सबसे उत्सुक बना देता है। मुझे यह जानने में दिलचस्पी होगी कि इस जवाब में आपको ऐसा विश्वास क्या है। जैसा कि मैंने कहा, मैं सी # और जावा से परिचित हूं, जहां आप जो कहते हैं वह सच है। लेकिन अब तक मैंने एमआरआई का उपयोग करके इसका सबूत नहीं देखा है; और वास्तव में जो मैंने पाया है (जैसे लेख मैंने प्रश्न में लिंक किया है) इसके विपरीत सुझाव देता है। मुझे लगता है कि मैं क्या कह रहा हूं एक संदर्भ की सराहना की जाएगी :) –

+0

क्या आपको विश्वास है कि निष्पादन का कोई अन्य धागा 'x' को उसके मूल्य को पुनर्प्राप्त करने के समय और नए मान के लिखे जाने से पहले अपडेट कर सकता है? – sarnold

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