2009-12-30 15 views
9

पर साझा किया गया है मैं एक साझा लाइब्रेरी (.so) और डीएल विकसित कर रहा हूं। मेरे पास एक वैश्विक चर है जो एकाधिक धागे में अद्यतन किया गया है। तो मेरे पास सिंक्रनाइज़ेशन के लिए म्यूटेक्स लॉक है।एक साझा लाइब्रेरी/डीएलएल में वैश्विक चर है, प्रक्रिया

मुझे स्पष्ट नहीं है कि साझा लाइब्रेरी में वैश्विक डेटा प्रक्रिया में साझा किया गया है या नहीं। यदि ऐसा है तो मुझे सिंक्रनाइज़ेशन के लिए सेमफोर का उपयोग करने की आवश्यकता है। जैसा कि मैं समझता हूं कि वैश्विक चर डेटा खंड का हिस्सा हैं इसलिए मैं समझना चाहता था कि डीएलएल प्रक्रियाओं में वैश्विक डेटा का प्रबंधन कैसे करता है। कोई जानकारी w.r.t. डीएलएल प्रारूप और सेगमेंट सहायक होगा।

धन्यवाद।

+0

डीएलएल वास्तव में कैसे काम करता है इस बारे में अच्छी व्याख्या के साथ संबंधित प्रश्न: http://stackoverflow.com/questions/12229396/unresolved-external-symbol-static-variable-variable-used-by-method -defined-in-h –

उत्तर

10

डिफ़ॉल्ट रूप से, नहीं, वैश्विक चर प्रक्रियाओं में साझा नहीं किए जाते हैं।

हालांकि, आप प्रक्रियाओं में वैश्विक चर साझा करने के लिए डेटा सेगमेंट (data_seg) का उपयोग कर सकते हैं। आप "How do I share data in my DLL with an application or with other DLLs?"

+0

@CasperOne: डिफ़ॉल्ट रूप से साझा लाइब्रेरी डेटा सेगमेंट प्रत्येक प्रक्रिया में डुप्लीकेट किया जाएगा? – Andy

+0

@ एंडी: मुझे नहीं पता कि डुप्लीकेट द्वारा आपका क्या मतलब है। असल में, आप प्रक्रियाओं में मानों को साझा करने में सक्षम होंगे यदि आप एक ही डीएलएल से लिंक करते हैं, तो अगर आप यही पूछ रहे हैं। अन्यथा, क्या आप विस्तृत कर सकते हैं? – casperOne

+0

@ कैस्परऑन: मुझे लगता है कि डीएलएल का कोड (टेक्स्ट) सेगमेंट प्रक्रिया में साझा किया जाता है। इसलिए मैं जानना चाहता था कि डीएल के डेटा सेगमेंट में क्या होता है। चाहे डीएल से डेटा सेगमेंट की सामग्री को प्रोसेस डेटा सेगमेंट में कॉपी किया गया हो। और यह डीएल की गतिशील लोडिंग के दौरान कैसे होता है। – Andy

0

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

+0

क्षमा करें, लेकिन यह वास्तव में सच नहीं है। – casperOne

+0

कुछ पढ़ने की कोशिश करें, उदाहरण के लिए: http://msdn.microsoft.com/en-us/library/ms810627.aspx स्मृति प्रबंधन/वर्चुअल मेमोरी मैपिंग और Win32 प्लेटफॉर्म पर विभिन्न प्रक्रियाओं में स्मृति को प्रबंधित करने के बारे में लिखने से पहले यहां कुछ भी :) – user224564

+0

पुरानी है कि आप "कुछ पढ़ने की कोशिश करें" कहां से कहते हैं, जब वास्तव में मैंने एमएसडीएन को एक लिंक पोस्ट किया जो दिखाता है कि वास्तव में क्या किया गया है, साथ ही आपका जवाब गलत क्यों है। – casperOne

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