पिछले कुछ दिनों में एक बहु-थ्रेडिंग को डिबग करने के दौरान, जहां एक धागा किसी ऑब्जेक्ट को किसी अन्य द्वारा उपयोग में ला रहा था, मुझे एहसास हुआ कि यह मुद्दा निदान करने के लिए बहुत आसान और त्वरित होगा अगर मैं 'यह' अस्थिर बना सकता। यह सिस्टम (सिम्बियन ओएस) पर क्रैश डंप को कहीं अधिक जानकारीपूर्ण में बदल देता।'यह' अस्थिर क्यों नहीं है?
तो, क्या ऐसा कोई कारण है कि यह क्यों नहीं हो सकता है, या नहीं होना चाहिए?
संपादित करें: तो इस परिदृश्य को रोकने या जांचने के लिए वास्तव में कोई सुरक्षित तरीका नहीं है। क्या यह कहना सही होगा कि स्टेल क्लास पॉइंटर्स तक पहुंचने का एक समाधान वैश्विक वैरिएबल होना चाहिए जो पॉइंटर रखता है, और किसी भी फ़ंक्शन को कॉल किया जाना चाहिए जो वैश्विक चर का उपयोग 'इस' के प्रतिस्थापन के रूप में किया जाना चाहिए?
static TAny* gGlobalPointer = NULL;
#define Harness static_cast<CSomeClass*>(gGlobalPointer);
class CSomeClass : public CBase
{
public:
static void DoSomething();
private:
int iMember;
};
void CSomeClass::DoSomething()
{
if (!Harness)
{
return;
}
Harness->iMember = 0;
}
तो यदि कोई अन्य धागा हटा दिया गया है और वैश्विक सूचक को न्यूल किया गया है तो इसे तुरंत पकड़ा जाएगा।
एक मुद्दा जो मुझे लगता है कि यह है कि यदि संकलक हर बार इसे जांचने के बजाय हार्नेस के मूल्य को कैश करता है।
क्या आपका मतलब यह है कि अगर यह अस्थिर था, तो यह आसान होगा, या यह आसान होगा अगर यह 'पॉइंटर-टू-अस्थिर था? दूसरे शब्दों में, क्या आप क्रैश डंप को 'इस' के पुराने मूल्य को देखते हुए देख रहे थे (जो कुछ अजीब लगता है क्योंकि यह कभी नहीं बदलेगा), या कुछ डेटा सदस्य? –