मैं बीजे मायर्स के (सही) उत्तर को स्पष्ट करना चाहता हूं।
सी # में एक घटना को प्रतिनिधि प्रकार के क्षेत्र के रूप में माना जा सकता है - जैसे कि संपत्ति को संपत्ति के क्षेत्र के रूप में माना जा सकता है - और उस "फ़ील्ड" का मूल्य शून्य हो सकता है। आप एक ईवेंट हैंडलर एक धागे पर संशोधित किया जा रहा एक और धागा यह आह्वान करने के लिए प्रयास कर रहा है, जबकि होने के दुर्भाग्यपूर्ण स्थिति में हैं, तो आप स्थिति में प्राप्त कर सकते हैं जहां:
if (this.SomeEvent != null)
this.SomeEvent(...);
threadsafe नहीं है। मान को उत्परिवर्तित किया जा सकता है ताकि चेक के बाद यह शून्य न हो, चेक के बाद शून्य हो, और प्रोग्राम क्रैश हो जाए।
इस "थ्रेडसेफ" को बनाने का सामान्य तरीका, और मैं सलाह देता हूं कि यह मान स्थानीय रूप से प्रतिलिपि बनाना है और फिर स्थानीय को शून्य के लिए जांचना है। यह एक शून्य dereference के साथ दुर्घटनाग्रस्त नहीं होने का लाभ है। हालांकि, चालाक डेवलपर ध्यान देगा कि अभी भी एक दौड़ है!अनुक्रम
- गैर अशक्त घटना धागा पर कैश हैंडलर एक
- ईवेंट हैंडलर धागा पर अशक्त करने के लिए सेट
- राज्य ईवेंट हैंडलर की जरूरत धागा पर नष्ट हो जाता है
- ईवेंट हैंडलर पर चलता हो सकता है थ्रेड ए और भयंकर
तो इस अर्थ में यह पैटर्न "थ्रेड सुरक्षित" नहीं है। यदि आप इस दुर्भाग्यपूर्ण स्थिति में हैं आप यह सुनिश्चित करने के लिए ज़िम्मेदार हैं कि उचित थ्रेडिंग तर्क लागू किया गया है ताकि यह न हो। हालांकि आप ऐसा कर सकते हैं। यदि आप किसी अन्य थ्रेड पर ईवेंट को म्यूट करते समय एक थ्रेड पर ईवेंट हैंडलर को कॉल करने में सक्षम होने के (संदिग्ध) लाभ चाहते हैं, तो आपको इसे सुरक्षित करने के लिए या रेस कंडीशन कीड़े से निपटने के लिए भुगतान करना होगा।
मैं व्यक्तिगत रूप से प्लेग की तरह इस स्थिति से बचूंगा, लेकिन मैं सही मल्टीथ्रेड कोड लिखने के लिए पर्याप्त स्मार्ट नहीं हूं।
अब, वास्तविक प्रश्न के लिए के रूप में:
some_expression ?. ToString();
रूप
temp = some_expression
temp == null ? null : temp.ToString()
ही है उत्तरार्द्ध कोड "threadsafe" आपकी राय में है?
स्रोत
2016-03-04 01:37:06
क्षमा करें, लेकिन कोड का पहला ब्लॉक पूरी तरह से थ्रेड सुरक्षित हो सकता है, जिस संदर्भ में इसका उपयोग किया जाता है और इसमें शामिल चर के दायरे के आधार पर। –
@ केनहाइट - मुझे लगता है कि पहले ब्लॉक के साथ विचार यह है कि एक और थ्रेड वैरिएबल को चेक के बाद 'शून्य' पर सेट कर सकता है, लेकिन 'टॉस्ट्रिंग()' कोड को असफल होने से पहले। मैं कहूंगा कि यह थ्रेड-सुरक्षित नहीं है। – Enigmativity
@ निष्क्रियता: पोस्टर ने विशेष रूप से कहा था कि कोड का ब्लॉक ** थ्रेड सुरक्षित ** नहीं था, जो संदर्भ या दायरे को जानने के बिना एक सटीक बयान नहीं है। मैंने इंगित किया कि कथन गलत था - यह असत्य है कि उस ब्लॉक में कोड निश्चित रूप से थ्रेड सुरक्षित नहीं है। –