यहाँ कई सवाल हैं। एक समय में उन्हें एक माना जाता है:
संदर्भ असाइनमेंट परमाणु है इसलिए इंटरलाक्ड। एक्सचेंज (रेफ ऑब्जेक्ट, ऑब्जेक्ट) की आवश्यकता क्यों है?
संदर्भ असाइनमेंट परमाणु है। Interlocked.Exchange केवल संदर्भ असाइनमेंट नहीं करता है। यह एक चर के वर्तमान मूल्य का एक पाठ करता है, पुराने मूल्य को दूर करता है, और एक परमाणु संचालन के रूप में, चर को नया मूल्य प्रदान करता है।
मेरे सहयोगी ने कहा कि कुछ प्लेटफार्मों पर यह गारंटी नहीं है कि संदर्भ असाइनमेंट परमाणु है। क्या मेरा सहकर्मी सही था?
नहीं। संदर्भ असाइनमेंट सभी .NET प्लेटफॉर्म पर परमाणु होने की गारंटी है।
मेरा सहकर्मी झूठे परिसरों से तर्क कर रहा है। क्या इसका मतलब यह है कि उनके निष्कर्ष गलत हैं?
जरुरी नहीं। आपका सहकर्मी आपको बुरे कारणों के लिए अच्छी सलाह दे सकता है। शायद कोई और कारण है जिसके कारण आपको इंटरलॉक का उपयोग करना चाहिए। लॉक-फ्री प्रोग्रामिंग बहुत मुश्किल है और जिस क्षण आप क्षेत्र में विशेषज्ञों द्वारा जासूसी की गई अच्छी तरह से स्थापित प्रथाओं से विदा होते हैं, आप मातम में हैं और सबसे खराब तरह की दौड़ की स्थिति को जोखिम में डालते हैं। मैं न तो इस क्षेत्र का विशेषज्ञ हूं और न ही आपके कोड का विशेषज्ञ हूं, इसलिए मैं एक तरह से या दूसरे तरीके से निर्णय नहीं कर सकता।
चेतावनी देता है "एक अस्थिर क्षेत्र के संदर्भ को अस्थिर नहीं माना जाएगा" मुझे इस बारे में क्या सोचना चाहिए?
आपको यह समझना चाहिए कि यह सामान्य रूप से समस्या क्यों है। इस बात की समझ पैदा होगी कि इस विशेष मामले में चेतावनी महत्वहीन क्यों है।
संकलक जो यह चेतावनी देता है उसका कारण यह है कि किसी क्षेत्र को अस्थिरता के रूप में चिह्नित करना "इस फ़ील्ड को कई थ्रेड पर अद्यतन किया जा रहा है - इस फ़ील्ड के मान को कैश करने वाला कोई कोड उत्पन्न न करें और सुनिश्चित करें कि कोई भी पढ़ता है या लिखता है यह क्षेत्र "समय से पहले और पीछे की ओर" प्रोसेसर कैश विसंगतियों के माध्यम से नहीं चला जाता है।
(मुझे लगता है कि आप वह सब कुछ पहले ही समझ गए हैं। यदि आपके पास अस्थिरता के अर्थ की विस्तृत समझ नहीं है और यह प्रोसेसर कैश शब्दार्थों को कैसे प्रभावित करता है तो आप यह नहीं समझते हैं कि यह कैसे काम करता है और इसे अस्थिर का उपयोग नहीं करना चाहिए। लॉक-फ्री प्रोग्राम। सही होना बहुत मुश्किल है; सुनिश्चित करें कि आपका कार्यक्रम सही है क्योंकि आप समझते हैं कि यह कैसे काम करता है, दुर्घटना से ठीक नहीं।)
अब मान लीजिए कि आप एक चर बनाते हैं जो उस क्षेत्र में एक रेफ पास करके एक अस्थिर क्षेत्र का उपनाम है। कहा विधि के अंदर, संकलक के पास यह जानने का कोई कारण नहीं है कि संदर्भ में वाष्पशील शब्दार्थ है! संकलक cheerfully विधि है कि अस्थिर क्षेत्रों के लिए नियमों को लागू करने के लिए विफल रहता है के लिए कोड उत्पन्न होगा, लेकिन चर है एक अस्थिर क्षेत्र। जो आपके लॉक-फ्री लॉजिक को पूरी तरह से खत्म कर सकता है; धारणा हमेशा यह है कि एक अस्थिर क्षेत्र हमेशा वाष्पशील शब्दार्थ के साथ पहुँचा जाता है। इसका कोई अर्थ नहीं है कि इसे कभी-कभी अस्थिर माना जाता है और अन्य बार नहीं; आपको हमेशा सुसंगत रहना होगा अन्यथा आप अन्य एक्सेस पर निरंतरता की गारंटी नहीं दे सकते।
इसलिए, जब आप ऐसा करते हैं तो संकलक चेतावनी देता है, क्योंकि यह संभवतः आपके ध्यान से विकसित लॉक-फ्री लॉजिक को पूरी तरह से गड़बड़ाने वाला है।
बेशक, Interlocked.Exchange है एक अस्थिर क्षेत्र उम्मीद को पत्र लिखा और सही काम। इसलिए चेतावनी भ्रामक है। मुझे इस बात का बहुत पछतावा है; हमें जो करना चाहिए था वह कुछ तंत्र को लागू कर रहा है जिससे इंटरलॉक की तरह एक विधि का एक लेखक। एक्सक्रॉज विधि पर एक विशेषता कह सकता है "यह विधि जो रेफरी के लिए अस्थिर शब्दार्थ को लागू करती है, इसलिए चेतावनी को दबाएं"। शायद संकलक के भविष्य के संस्करण में हम ऐसा करेंगे।