में साझा संसाधनों को लॉक करना मुझे विश्वास है कि कम से कम सी ++ में बहु-थ्रेडिंग की मूलभूत बातें पर मुझे अच्छा संभाल मिला है, लेकिन साझा संसाधनों के आस-पास एक म्यूटेक्स को लॉक करने पर मुझे कभी भी स्पष्ट उत्तर नहीं मिला है निर्माता या विनाशक में। मैं इस धारणा के तहत था कि आपको दोनों जगहों पर ताला लगा देना चाहिए, लेकिन हाल ही में सहकर्मी असहमत हैं।कन्स्ट्रक्टर और विनाशक
class TestClass
{
public:
TestClass(const float input) :
mMutex(),
mValueOne(1),
mValueTwo("Text")
{
//**Does the mutex need to be locked here?
mValueTwo.Set(input);
mValueOne = mValueTwo.Get();
}
~TestClass()
{
//Lock Here?
}
int GetValueOne() const
{
Lock(mMutex);
return mValueOne;
}
void SetValueOne(const int value)
{
Lock(mMutex);
mValueOne = value;
}
CustomType GetValueTwo() const
{
Lock(mMutex);
return mValueOne;
}
void SetValueTwo(const CustomType type)
{
Lock(mMutex);
mValueTwo = type;
}
private:
Mutex mMutex;
int mValueOne;
CustomType mValueTwo;
};
पाठ्यक्रम सब कुछ के
प्रारंभ सूची के माध्यम से सुरक्षित होना चाहिए, लेकिन क्या निर्माता के अंदर बयान के बारे में: नाटक निम्नलिखित वर्ग एक से अधिक थ्रेड द्वारा पहुँचा है? विनाशक में यह गैर-स्कोप्ड लॉक करने के लिए फायदेमंद होगा, और कभी अनलॉक नहीं होगा (अनिवार्य रूप से केवल pthread_mutex_destroy को कॉल करें)?
जब आप कहते हैं कि 'क्लास' है एकाधिक धागे के बीच प्रयोग किया जाता है, मुझे लगता है कि आप का मतलब है कि टेस्ट क्लास प्रकार का ऑब्जेक्ट कई धागे में उपयोग किया जा सकता है। उस स्थिति में, आप अभी भी केवल एक वस्तु बना रहे हैं, इसलिए आपको कन्स्ट्रक्टर में लॉकिंग की आवश्यकता नहीं है। यदि दोनों धागे एक ही समय में कन्स्ट्रक्टर में हैं, तो वे 2 अलग-अलग वस्तुएं बना रहे हैं। ऑब्जेक्ट निर्माण के चारों ओर लॉक करने के लिए यह अधिक समझ में आता है, सुनिश्चित करने के लिए (उदाहरण के लिए) वस्तु का निर्माण समाप्त होने से पहले mValueTwo का उपयोग नहीं किया जाता है। विनाशक को लगता है कि इसे लॉक करना चाहिए, यह सुनिश्चित करने के लिए कि नष्ट होने के दौरान डेटा तक पहुंचा नहीं जा सके। – Rollie
@ रोली हां, मेरा मतलब था कि ऑब्जेक्ट साझा किया जाएगा। इसलिए, यदि मैं बना देता हूं: – Brett
@Rollie: इसे नष्ट करने के दौरान कक्षा तक पहुंच उदाहरणों के साथ एक बग है जीवन-प्रबंधन प्रबंधन - जब ऐसा होता है तो कार्यक्रम पहले से ही टूट जाता है (यदि इसे नष्ट करने के दौरान उपयोग किया जा सकता है, तो यह बाद में भी हो सकता है)। –