2011-01-09 15 views
12

मैं सी ++ में एक गेम इंजन लाइब्रेरी का निर्माण कर रहा हूं। थोड़ी देर पहले मैं एक आवेदन बनाने के लिए क्यूटी का उपयोग कर रहा था और Implicit Sharing के उपयोग से मोहित था। मैं सोच रहा हूं कि कोई भी इस तकनीक को अधिक विस्तार से समझा सकता है या कार्रवाई में इसका एक सरल उदाहरण प्रदान कर सकता है।निहित साझाकरण क्या है?

+5

आपने दस्तावेज़ों के लिए एक लिंक दिया जो यह काम करता है कि एक उत्कृष्ट स्पष्टीकरण प्रदान करता है। इसमें एक संदर्भ भी है [थ्रेड डॉक्स बताते हैं कि परमाणु संदर्भ गिनती बहु-थ्रेडेड ऐप्स में कैसे मदद करती है] (http://doc.trolltech.com/latest/threads-modules.html#threads-and-implicitly-shared-classes)। अगर कुछ अभी भी अस्पष्ट नहीं है, तो आपको उस बारे में अधिक विस्तृत प्रश्न पूछना चाहिए। और यह न भूलें कि आप हमेशा क्यूटी के स्रोतों को देख सकते हैं। –

+0

* निहित साझाकरण * के लिए दूसरा नाम * कॉपी-ऑन-राइट * है। आप इस अन्य नाम का उल्लेख करने वाले प्रश्नों पर एक नज़र डालना चाहेंगे जैसे उदाहरण के लिए: http://stackoverflow.com/questions/628938/what-is-copy-on-write –

+0

मेरा मानना ​​है कि निहित साझाकरण सिर्फ क्यूटी है [कॉपी-ऑन-राइट] का कार्यान्वयन (https://en.wikipedia.org/wiki/Copy-on-write)। – HelloGoodbye

उत्तर

31

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

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

इस दृष्टिकोण में चुनौती यह है कि इसका मतलब है कि कई अलग-अलग वस्तुएं सभी एक ही कार्यान्वयन पर इंगित होंगी। इसका अर्थ यह है कि अगर कोई कार्यान्वयन में बदलाव करने के लिए समाप्त होता है, तो उस क्रियान्वयन के संदर्भ में प्रत्येक ऑब्जेक्ट में परिवर्तन दिखाई देंगे - एक बहुत ही गंभीर समस्या। इसे ठीक करने के लिए, हर बार एक ऑपरेशन किया जाता है जो संभावित रूप से कार्यान्वयन को बदल सकता है, ऑपरेशन यह देखने के लिए जांच करता है कि क्या कोई अन्य ऑब्जेक्ट यह भी देखकर कार्यान्वयन का संदर्भ देता है कि संदर्भ गणना समान है या नहीं। यदि कोई अन्य ऑब्जेक्ट ऑब्जेक्ट का संदर्भ नहीं देता है, तो ऑपरेशन आगे बढ़ सकता है - प्रसारों में बदलाव की कोई संभावना नहीं है। यदि डेटा का संदर्भ देने वाले कम से कम एक अन्य ऑब्जेक्ट है, तो रैपर पहले स्वयं के लिए कार्यान्वयन की एक गहरी प्रतिलिपि बनाता है और नई ऑब्जेक्ट को इंगित करने के लिए अपने पॉइंटर को बदल देता है। अब हम जानते हैं कि कोई साझाकरण नहीं हो सकता है, और बिना किसी परेशानी के बदलाव किए जा सकते हैं।

यदि आप इस कार्रवाई के कुछ उदाहरण देखना चाहते हैं, तो Stanford's introductory C++ programming course से व्याख्यान उदाहरण 15.0 और 16.0 पर एक नज़र डालें। यह दिखाता है कि किसी ऑब्जेक्ट को इस तकनीक का उपयोग करके शब्दों की सूची रखने के लिए कैसे डिज़ाइन किया जाए।

आशा है कि इससे मदद मिलती है!

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