2012-07-24 16 views
5

मैं एक जटिल डेटा संरचना तक पहुंच नियंत्रित करने के लिए एक कंटेनर क्लास लिखने के बारे में सोच रहा हूं जो बहु-थ्रेडेड वातावरण में उपयोग करेगा।सी ++ कन्स्ट्रक्टर और समरूपता

और फिर सवाल मेरे लिए हुई:

वहाँ कभी एक स्थिति है जहाँ C++ कंस्ट्रक्टर्स धागा होने चाहिए है?

उत्तर

2

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

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

इसे देखने का एक और तरीका यह है: ऑब्जेक्ट्स को उनके रचनाकारों के लौटने तक तर्कसंगत रूप से असामान्य माना जाना चाहिए। तो, एक वस्तु बनाने की प्रक्रिया में एक थ्रेड एकमात्र धागा है जो इसके बारे में "जानता है"।

बेशक

, उचित तुल्यकालन नियम किसी भी साझा संसाधन के लिए निर्माता ही तक पहुँचता है लागू होते हैं, लेकिन यह है कि (मैं लोगों को कि यह एहसास करने के लिए असफल का सामना किया है, यह मानते हुए कंस्ट्रक्टर्स विशेष कर रहे हैं और किसी भी तरह के लिए अनन्य पहुँच प्रदान करते हैं किसी भी कार्य करने के लिए लागू होता है सभी संसाधन)।

+0

यह पूरी तरह से सच नहीं है। जब आप सिंगलटन डिज़ाइन पैटर्न का उपयोग करते हैं तो कन्स्ट्रक्टर के लिए थ्रेड-सुरक्षित चिंताएं होती हैं। और अभी मैं इस स्थिति के लिए एक समाधान खोज रहा हूँ। – PDuarte

3

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

आप एक ही ऑब्जेक्ट को एक से अधिक धागे पर एक ही समय में नहीं बना सकते हैं, क्योंकि प्रत्येक ऑब्जेक्ट केवल एक बार बनाया जाता है, इसलिए एक ही ऑब्जेक्ट पर कन्स्ट्रक्टर को एक से अधिक बार आमंत्रित करने का कोई तरीका नहीं है, दो अलग-अलग धागे पर बहुत कम एक ही समय में।

+0

सी ++ में ऑब्जेक्ट तकनीकी रूप से मौजूद होता है जब तक कि कन्स्ट्रक्टर पूरा नहीं हो जाता है, इसलिए अगर निर्माता के पास ऑब्जेक्ट के बाहर दुष्प्रभाव नहीं हैं, तो क्या अन्य थ्रेड इसे एक्सेस कर सकते हैं? – ThomasMcLeod

+1

लेकिन ऐसे कई तरीके हैं जिनसे आप एक ही समय में एक ही स्थान पर दो अलग-अलग वस्तुओं को बनाने की कोशिश कर सकते हैं ... प्लेसमेंट नया दिमाग में आता है। जबकि आप इसे स्वयं नहीं कर रहे हैं। यह तब भी हो सकता है जब आप एक वेक्टर में प्रविष्टियों को वापस दबा रहे हों। यह तब नहीं हो सकता है जब आपके पास ऑब्जेक्ट्स के स्मृति स्थान की सुरक्षा सिंक्रनाइज़ेशन हो, हालांकि इस उदाहरण में वेक्टर पर एक लॉक। –

+0

@ माइकल एंडरसन, मैं आपके वेक्टर उदाहरण का पालन नहीं कर रहा हूं। – ThomasMcLeod

4

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

+0

सिंगलटन पैटर्न के लिए सच नहीं है। एक सिंगलटन के साथ – PDuarte

+0

@PDuarte, अभी भी एक बार नामक एक कन्स्ट्रक्टर है। –

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