मैं एक विरासत कोड के माध्यम से जा रहा है और निम्नलिखित स्निपेट मिला था:क्या विनाशक थ्रेडसेफ होना चाहिए?
MyClass::~MyClass()
{
EnterCriticalSection(&cs);
//Access Data Members, **NO Global** members are being accessed here
LeaveCriticalSection(&cs);
}
मैं इसे नाशक रक्षा करने के लिए किसी भी संयोग से मदद मिलेगी सोच रहा हूँ?
एक परिदृश्य पर विचार करें:
1. Thread1 - About to execute any of the member function which uses critical section
2. Thread2- About to execute destructor.
हैं निष्पादन के आदेश 1 = है> 2 तो यह काम हो सकता है। लेकिन अगर आदेश उलट दिया गया है तो क्या होगा?
क्या यह एक डिजाइन मुद्दा है?
लेकिन क्या यह स्वयं धागा-सुरक्षित होना चाहिए? क्या कोई मौका है कि एक वर्ग को समानांतर में "दो बार नष्ट कर दिया जाएगा"? –
@ टॉमसज़ेटो: नहीं। यदि एक वर्ग (एक गैर-तुच्छ विनाशक के साथ) "दो बार नष्ट हो जाता है" इससे कोई फर्क नहीं पड़ता कि यह थ्रेडसेफ तरीके से होता है या नहीं - यह किसी भी मामले में यूबी है। – MikeMB
उत्तर की उम्र के बावजूद, मैं असहमत हूं। एक सिंक्रनाइज़ेशन लागू किया जाना चाहिए यदि सदस्य चर को थ्रेड की तुलना में किसी अन्य थ्रेड द्वारा संशोधित किया गया है जहां dtor कहा जाएगा।हालांकि, इसे "महत्वपूर्ण खंड" होने की आवश्यकता नहीं है। क्या आवश्यक है, कि दो धागे के बीच संबंध "सिंक्रनाइज़ेशन-विद" है। इसके लिए धागे में उपयुक्त मेमोरी बाधाओं की आवश्यकता हो सकती है - जब तक कि धागे समान न हों। – CouchDeveloper