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