2014-10-15 7 views
9

में मुझे यकीन है कि, व्यावहारिक रूप से, ::new का उपयोग थ्रेड-सुरक्षित है। मेरा सवाल यह है कि मानक का कौन सा हिस्सा गारंटी देता है, अगर कोई है? क्या यह एक सम्मेलन है? क्या यह कुछ ऐसा है जहां मानक विभिन्न प्रकार के अक्षरों का समर्थन करने के लिए कार्यान्वयन को बहुत अक्षांश देता है (जैसे प्रत्येक डेटा प्रकार के आकार के अपेक्षाकृत ढीले बाधाओं की तरह)?की नई सुरक्षा सी ++ 11

मुझे उम्मीद है कि सी ++ 11 मानक में केवल एक पंक्ति है जो स्पष्ट रूप से निर्दिष्ट करती है "::new के कार्यान्वयन थ्रेड-सुरक्षित होना चाहिए"।

मैं ऑपरेटर के नए ओवरलोड की थ्रेड-सुरक्षा के बारे में कुछ मानक देखना भी पसंद करूंगा। मुझे कल्पना है कि उन्हें थ्रेड-सुरक्षित होने के लिए होने की आवश्यकता होगी, लेकिन ये फ़ंक्शंस कंबल गारंटी के अंतर्गत भी नहीं आते हैं जो const => थ्रेड सुरक्षित (सी ++ 11 में) है।

धन्यवाद!

+0

मानक आपको गारंटी देता है कि _your_ 'ऑपरेटर नया 'ओवरलोड थ्रेड-सुरक्षित है? आपका कार्यक्रम, आपकी समस्याएं। – MSalters

+0

@MSalters - इसी कारण से यह const => थ्रेड-सुरक्षित बनाता है। क्योंकि आपके कोड में भी गारंटी सुनिश्चित किए बिना, आप मानक लाइब्रेरी से सुरक्षित रूप से बातचीत नहीं कर सकते हैं। क्या आप पैर में खुद को गोली मार सकते हैं? हां, सी ++ में बस कुछ भी पसंद है ... लेकिन यह शायद ही बात है। – Mark

उत्तर

9

मुझे विश्वास है कि यह है सी ++ 11 मानक द्वारा गारंटीकृत है। यदि यह नहीं था, तो ऑपरेटर की नई या नई अभिव्यक्ति का उपयोग डेटा रेस का कारण बन सकता है, और मानक द्वारा इसकी अनुमति नहीं दी जाएगी। संदर्भ के लिए, §17.6.5.9 डाटा दौड़ परिहार और भी

18.6.1.4 डाटा दौड़ [new.delete.dataraces]

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

वैश्विक ऑपरेटरों के लिए आपके स्वयं के ओवरराइड या आपकी खुद की प्रतिस्थापन इस आवश्यकता को पूरा करना चाहिए।

यह भी देखें proposal N3664 "Clarifying Memory Allocation", जो उस मामले पर अधिक जोर देता है।

2

सी ++ मानक की आवश्यकता नहीं है कि new थ्रेड-सुरक्षित हो। कुछ कार्यान्वयन स्पष्ट रूप से सिंगल-थ्रेडेड मोड में सी ++ कोड बनाने का समर्थन करते हैं, जहां सी मानक लाइब्रेरी, mallloc() सहित थ्रेड-सुरक्षित नहीं हो सकती है। प्लेटफॉर्म हम में से अधिकांश लोग हर दिन थ्रेड-सुरक्षित आवंटन की पेशकश करते हैं।

भले ही आपका प्लेटफ़ॉर्म थ्रेड-सुरक्षित new प्रदान करता है, फिर भी यदि आप किसी भी पुस्तकालय का उपयोग करते हैं जो आपके operator new को लागू करते हैं, या यदि आप ऐसा करते हैं तो आपको सावधान रहना होगा। new लिखना निश्चित रूप से संभव है जो केवल एक ही धागे में काम करता है - यहां तक ​​कि जानबूझकर भी!