2010-03-02 17 views
13

में आवंटित कर सकता हूं यदि मैं सी ++ (या तो नया या मॉलोक) में एक थ्रेड में स्मृति आवंटित करता हूं, तो क्या मैं इसे दूसरे में आवंटित कर सकता हूं, या दोनों में होना चाहिए एक ही धागा? आदर्श रूप से, मैं इसे पहले स्थान से बचना चाहता हूं, लेकिन मुझे यह जानकर उत्सुकता है कि यह कानूनी, अवैध या कार्यान्वयन निर्भर है।यदि मैं सी ++ में एक थ्रेड में स्मृति आवंटित करता हूं, तो क्या मैं इसे

संपादित करें: compilers मैं वर्तमान में उपयोग कर रहा हूँ VS2003, VS2008 और शामिल एंबेडेड सी ++ 4.0, लक्ष्यीकरण एक्सपी, विस्टा, विंडोज 7 और विंडोज सीई/PocketPC & मोबाइल के विभिन्न जायके। तो मूल रूप से सभी माइक्रोसॉफ्ट लेकिन गूढ़ प्लेटफॉर्म की एक सरणी में।

+2

सी ++ मानक में थ्रेड के बारे में बात नहीं की जाती है। यह सभी कार्यान्वयन विशिष्ट है। – legends2k

+0

यदि आप उपयोग चुड़ैल कंपाइलर, ओएस आदि का उपयोग करते हैं, तो आप कुछ और सहायक उत्तरदाताओं को प्राप्त कर सकते हैं –

+0

@ इयान, कंपाइलर और ओएस विवरण जोड़े गए। –

उत्तर

17

आम तौर पर, बहु थ्रेडेड सिस्टम पर malloc/new/free/delete थ्रेड सुरक्षित हैं, इसलिए यह कोई समस्या नहीं होनी चाहिए - और एक थ्रेड में आवंटित करना, दूसरे में deallocating करना एक आम बात है।

चूंकि थ्रेड एक कार्यान्वयन सुविधा है, यह निश्चित रूप से लागू कार्यान्वयन है - उदा। कुछ सिस्टमों के लिए आपको एक बहु थ्रेडेड रनटाइम लाइब्रेरी से लिंक करने की आवश्यकता होती है।

+1

+1 - बस सही उत्तर के बारे में। –

1

इस अनुपयोगी उत्तर के लिए खेद है, लेकिन सी ++ मानक में धागे नहीं हैं, इसलिए सभी शर्त बंद हैं!

हालांकि, कुछ सी ++ कंपाइलर और रन-टाइम सिस्टम थ्रेडिंग का समर्थन करते हैं, इन पर आपको अक्सर मानक पुस्तकालयों के थ्रेड सुरक्षित संस्करण का उपयोग करने के लिए लिंकर को बताना होगा।

2

एक थ्रेड में आवंटित करने और दूसरे में मुक्त करने में सक्षम होने के लिए, आपको रनटाइम लाइब्रेरी को थ्रेड सुरक्षित होने की आवश्यकता है। विजुअल स्टूडियो 2005 के बाद से माइक्रोसॉफ्ट रनटाइम्स सभी थ्रेड सुरक्षित हैं, विजुअल स्टूडियो 2003 एकल थ्रेडेड और थ्रेड सुरक्षित रनटाइम्स दोनों प्रदान करता है - जाहिर है कि यदि आप थ्रेडिंग का उपयोग कर रहे हैं तो आपको मल्टीथ्रेड वाले लोगों से लिंक करना चुनना चाहिए।

चाहे यह कानूनी, अवैध या कार्यान्वयन निर्भर है, मैं उपरोक्त में से कोई भी नहीं कहूंगा। यह पूरी तरह से मानक के दायरे से बाहर है क्योंकि यह बिल्कुल थ्रेडिंग का उल्लेख नहीं करता है।

+0

धन्यवाद जो, अच्छी तरह से जानने योग्य है क्योंकि हमारे पास अभी भी वीएस2003 पर बैठे कुछ विकास हैं। –

+0

वीएस2003 मल्टीथ्रेडेड और सिंगल थ्रेडेड रनटाइम दोनों प्रदान करता है - आपको बस यह सुनिश्चित करना होगा कि आप सही लोगों के साथ जुड़ रहे हैं। –

1

मेरा मानना ​​है कि यह कार्यान्वयन कार्यान्वित किया गया है क्योंकि सी ++ मानक कुछ भी नहीं कहता है कि धागे पता स्थान कैसे साझा करेंगे।

0

यह काम करता है क्योंकि सूत्र एक ही प्रक्रिया से संबंध रखते हैं और एक ही पता स्थान साझा ..

6

वहाँ नए के बारे में कुछ भी नहीं है/खुद को हटा दें जिनकी आपको आवंटन और अलग धागे में deallocating से रोका जा सके। जैसा कि कई ने कहा है, मानक मल्टी-थ्रेडिंग पर चुप है - बहु-थ्रेडिंग के लिए न तो समर्थन है, न ही कोई मानक सुविधाओं का उपयोग करके इसे करने से आपको रोक रहा है। यह अच्छा और बुरा दोनों है कि आप जो कुछ भी चाहते हैं वह कर सकते हैं, लेकिन भाषा सुरक्षित रूप से करने में आपकी सहायता के लिए कोई प्रत्यक्ष तंत्र प्रदान नहीं करती है।

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

+0

प्रतिक्रिया जॉन के लिए धन्यवाद। मैंने जानबूझकर संकीर्ण सवाल रखा क्योंकि मुझे पता है कि बहु-थ्रेडेड कोड लिखने के विभिन्न संभावित नुकसान पर चर्चा करने से बड़ी किताब लेनी होगी। मैं कहता हूं कि यह एक से अधिक अवसरों पर खुद को कई गड्ढे में गिर गया है;) –

+0

यह पुराने एक्टिजन गेम खेलने जैसा है, है ना? –

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

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