मेरे पास .NET/मूल C++ एप्लिकेशन है। वर्तमान में, सी ++ कोड डिफ़ॉल्ट ढेर पर स्मृति आवंटित करता है जो एप्लिकेशन के जीवन के लिए जारी रहता है। असल में, कार्यों/आदेशों को सी ++ में निष्पादित किया जाता है जिसके परिणामस्वरूप वर्तमान निरंतर स्मृति का आवंटन/संशोधन होता है। मैं इन कार्यों में से किसी एक को रद्द करने के लिए एक दृष्टिकोण की जांच कर रहा हूं/मध्य-निष्पादन आदेश। हमारे पास इनमें से सैकड़ों कमांड हैं, और कई बहुत ही जटिल (विरासत) कोड हैं।क्या Win32 "हिल" आवंटित स्मृति को स्थानांतरित कर सकता है?
क्रूर-बल दृष्टिकोण जिसे मैं टालने की कोशिश कर रहा हूं, रद्द करने की जांच करने के लिए प्रत्येक आदेश/फ़ंक्शन को संशोधित कर रहा है और सभी उचित सफाई (मुक्त ढेर मेमोरी) कर रहा है। मैं एक बहु थ्रेडेड दृष्टिकोण की जांच कर रहा हूं जिसमें एक अतिरिक्त थ्रेड रद्दीकरण अनुरोध प्राप्त करता है और कमांड निष्पादन थ्रेड को समाप्त करता है। मैं HeapCreate()
(Win32) का उपयोग कर सभी "गतिशील ढेर" पर सभी गतिशील स्मृति आवंटित करना चाहता हूं। इस तरह, रद्दीकरण अनुरोध को संभालने वाले थ्रेड द्वारा निजी ढेर को नष्ट किया जा सकता है। हालांकि, अगर आदेश पूरा होने के लिए चलता है, तो मुझे जारी रखने के लिए गतिशील स्मृति की आवश्यकता होती है। इस मामले में, मैं एक निजी प्रतिलिपि की लागत के बिना डिफ़ॉल्ट/प्रक्रिया ढेर में निजी ढेर मेमोरी को "चलाना" के तार्किक समकक्ष करना चाहता हूं। क्या यह किसी भी तरह से संभव है? क्या यह भी समझ में आता है?
वैकल्पिक रूप से, मुझे पता है कि मैं प्रत्येक आदेश/फ़ंक्शन निष्पादन के लिए केवल एक नया निजी ढेर सकता हूं (प्रत्येक एक नया धागा होगा)। कमांड रद्द होने पर निजी ढेर को नष्ट किया जा सकता है, या अगर आदेश पूरा हो जाता है तो यह जीवित रहेगा। क्या संख्या के साथ अनिश्चित काल तक बढ़ने में कोई समस्या है? मुझे पता है कि प्रत्येक ढेर के साथ कुछ ओवरहेड शामिल है। मैं किस सीमा में भाग सकता हूं?
मैं 8 जीबी रैम के साथ विंडोज 7 64-बिट पर चल रहा हूं (इसे लक्षित प्लेटफ़ॉर्म पर विचार करें)। जिस एप्लिकेशन के साथ मैं काम कर रहा हूं वह लगभग 1 मिलियन एसएलओसी (आधा सी ++, आधा सी #) है। मैं निजी ढेर प्रबंधन, या मेरे समाधान के विकल्प के साथ किसी भी अनुभव/सुझाव की तलाश में हूं।
क्या आप पूछ रहे हैं कि एक ही ढेर में आवंटित स्मृति को वास्तव में डेटा की प्रतिलिपि किए बिना किसी अन्य ढेर में "पुनः निर्दिष्ट" किया जा सकता है? –
मुझे 92% यकीन है कि उत्तर नहीं है। लेकिन इसे उत्तर के रूप में पोस्ट करने के लिए पर्याप्त नहीं है। –
हीप मेमोरी आवंटन केवल एकमात्र समस्या नहीं है जिसे आप जबरन थ्रेड को समाप्त कर देंगे। धागे को समाप्त करने का एकमात्र सुरक्षित तरीका अंदर से है। इस तरह, आप जानते हैं कि थ्रेड कुछ लॉक ऑपरेशन के बीच में नहीं है। अंतःक्रियाशीलता को आपके कार्यों की एक आंतरिक विशेषता होना चाहिए; यह ऐसा कुछ नहीं है जिसे आप बाहर से बोल्ट कर सकते हैं। –