2011-12-28 11 views
8

मुझे संदर्भ प्रकार के लिए volatile पर भ्रमित हो गया।संदर्भ प्रकार के लिए अस्थिर .net 4.0

मैं समझता हूं कि आदिम प्रकार के लिए, volatile तत्काल किसी अन्य धागे से मूल्य परिवर्तन को प्रतिबिंबित कर सकता है। संदर्भ प्रकार के लिए, यह तुरंत पता परिवर्तन को प्रतिबिंबित कर सकता है। हालांकि, वस्तु की सामग्री के बारे में क्या। क्या वे अभी भी कैश किए गए हैं?

(एक परमाणु आपरेशन मान लिया जाये कि List.Add() है)

उदाहरण के लिए, मेरे पास है: एक धागा समारोह AddValue कॉल

class A 
{ 
    volatile List<String> list; 
    void AddValue() 
    { 
     list.Add("a value"); 
    } 

} 

हैं, तो सूची का पता नहीं बदलता है, एक और धागा अपडेट कर दिया जाएगा सूची के "सामग्री" परिवर्तन के बारे में, या सामग्री को प्रत्येक थ्रेड के लिए कैश किया जा सकता है और यह अन्य धागे के लिए अद्यतन नहीं होता है?

+0

मुझे इस बारे में निश्चित नहीं है, लेकिन मेरा अनुमान है कि यह सूची वास्तव में केवल एक सूचक (पता) है, जब सामग्री अपडेट हो जाती है तो यह तुरंत हर जगह परिलक्षित होता है, क्योंकि सामग्री ढेर में रहती है, हालांकि, एड्रेस-चेंज स्टैक बदल गया है, और मुझे लगता है कि एक कोर पर रह सकता है। लेकिन, जैसा कि कहा, कोई विशेषज्ञ नहीं है। यह केवल एक अनुमान है। – Alxandr

+0

इसके अलावा, एक साइड-नोट के रूप में। बहुत सारे अनुकूलन के अस्थिर मोड़। अनुकूलन का एक बहुत कुछ। कुछ लोगों द्वारा अस्थिर संशोधकों का उपयोग न करने की दृढ़ता से अनुशंसा की जाती है, बल्कि आवश्यक होने पर अस्थिर और वाष्पशीलता का उपयोग करें (सिस्टम नामस्थान में कक्षा पर पाए जाने वाले कुछ वैश्विक स्थैतिक विधि, शायद Google पर पाए जा सकते हैं)। – Alxandr

+1

@Axxandr: सावधान रहें। अस्थिर पढ़ने और अस्थिर लेखन संभावित रूप से महंगी विधियों को कॉल करने के लिए हैं और वे * पूर्ण बाड़ * प्रेरित करते हैं, आधे बाड़ की उम्मीद नहीं होगी। यदि आप प्रदर्शन कारणों से लॉक-फ्री कोड लिख रहे हैं (और आपको यह पागल चीज़ क्या करना है?) यह पूरी तरह से संभव है कि वोल्टाइल रीड और वोल्टाइलवाइट खराब हो। आपको इसे सावधानी से प्रोफाइल करना होगा। –

उत्तर

2

volatile कीवर्ड की सूची के सामग्री पर कोई प्रभाव नहीं पड़ता है (या, अधिक सटीक रूप से, ऑब्जेक्ट संदर्भित किया जा रहा है)।

के बारे में अद्यतन बोलते हुए/एक और धागा के लिए अद्यतन नहीं क्या हो रहा है की एक अति है। साझा सूची में पहुंच सिंक्रनाइज़ करने के लिए आपको lock कथन का उपयोग करना चाहिए। अन्यथा आप प्रभावी रूप से दौड़ की स्थिति का सामना कर रहे हैं जो प्रोग्राम क्रैश का कारण बन सकता है। List<T> कक्षा अपने आप से थ्रेड-सुरक्षित नहीं है।

6

इससे भी बदतर है।

यदि आप एक ऐसी वस्तु तक पहुंचते हैं जो थ्रेड-सुरक्षित नहीं है, तो आपका प्रोग्राम वास्तव में क्रैश हो सकता है। पुरानी जानकारी प्राप्त करना सबसे खराब संभावित परिणाम नहीं है।

थ्रेड के बीच .NET बेस क्लास लाइब्रेरी ऑब्जेक्ट्स साझा करते समय, आपके पास लॉकिंग का उपयोग करने के अलावा वास्तव में कोई विकल्प नहीं है। लॉकलेस प्रोग्रामिंग के लिए, आपको निम्नतम स्तरों पर अपने डेटा संरचनाओं में आक्रामक परिवर्तन की आवश्यकता है।

19

मैं समझता हूँ कि आदिम प्रकार के लिए, अस्थिर एक और धागा तुरंत

आपको कम से कम तीन तरीकों से गलत तरीके से समझने के मान से बदलाव को प्रतिबिंबित कर सकते हैं। आपको कमजोर स्मृति मॉडल के बारे में सब कुछ गहराई से समझने तक, अस्थिरता का उपयोग करने का प्रयास नहीं करना चाहिए, और वे आपके कार्यक्रम को कैसे प्रभावित करते हैं, और वे आपके कार्यक्रम को कैसे प्रभावित करते हैं।

पहले, स्पष्ट रहें कि अस्थिर चर, नहीं मूल्यों प्रभावित करता है।

दूसरा, अस्थिर चर उन तत्वों को प्रभावित नहीं करता है जिनमें मान प्रकारों के मान अलग-अलग होते हैं, इससे भिन्नताएं होती हैं जिनमें संदर्भ होते हैं।

तीसरा, अस्थिरता का मतलब यह नहीं है कि अन्य धागे से मूल्य परिवर्तन तुरंत दिखाई दे रहे हैं। अस्थिरता का मतलब है कि चर प्राप्त करते हैं और semantics जारी करते हैं। अस्थिर को उस क्रम में प्रभावित करता है जिसमें स्मृति उत्परिवर्तन के साइड इफेक्ट्स को किसी विशेष थ्रेड से होने के लिए देखा जा सकता है।विचार है कि उत्परिवर्तनों का निरंतर सार्वभौमिक क्रम मौजूद है और यह कि उस क्रम में उन उत्परिवर्तनों को तुरंत सभी धागे से देखा जा सकता है, स्मृति मॉडल द्वारा गारंटी नहीं है।

हालांकि, वस्तु की सामग्री के बारे में?

क्या इसके बारे में? संदर्भ प्रकार के अस्थिर चर द्वारा संदर्भित भंडारण स्थान में कोई विशेष थ्रेडिंग विशेषताओं की आवश्यकता नहीं है।

यदि एक थ्रेड फ़ंक्शन AddValue को कॉल करता है, तो सूची का पता नहीं बदलता है, क्या कोई अन्य थ्रेड सूची के "सामग्री" परिवर्तन के बारे में अपडेट हो जाएगा।

नहीं। यह क्यों होगा वह अन्य थ्रेड एक अलग प्रोसेसर पर हो सकता है, और प्रोसेसर कैश ने उस पृष्ठ को प्री-लोड किया हो सकता है जिसमें सूची का समर्थन करने वाले सरणी का पता शामिल है। सूची को म्यूट करने से भंडारण स्थान बदल गया हो सकता है जिसमें कुछ पूरी तरह से अलग स्थान को संदर्भित करने के लिए सरणी का पता होता है।

बेशक

, सूची वर्ग पहली जगह में threadsafe नहीं है। यदि आप सूची में पहुंच लॉक नहीं कर रहे हैं तो सूची करने पर आप आसानी से क्रैश और मर सकते हैं।

आप अस्थिर जरूरत नहीं है, सूची में पहुंच के आसपास थ्रेड लॉक डालने के लिए आपको क्या चाहिए। चूंकि थ्रेड लॉक पूर्ण बाड़ उत्पन्न करते हैं, इसलिए आपको अस्थिर द्वारा पेश की गई आधा बाड़ की आवश्यकता नहीं होनी चाहिए। और क्या अस्थिर वास्तव में करता है के बारे में एक अच्छा स्पष्टीकरण इससे कैसे प्रभावित क्षेत्रों के लिए http://www.albahari.com/threading/part4.aspx#_The_volatile_keyword पर

+0

धन्यवाद बहुत एरिक। आपकी व्याख्या के बारे में मेरी समझ के आधार पर, स्मृति उत्परिवर्तन के दुष्प्रभाव को रोकने के लिए अस्थिरता का उपयोग किया जाता है। हालांकि, स्मृति मूल्य की सीपीयू रजिस्टर प्रति को रोकने के लिए क्या उपयोग किया जाता है। मल्टी-कोर सीपीयू में, दो कोर कई कैश चर की दो प्रतियां (उदाहरण के लिए एक int), यदि उनमें से एक इसे अद्यतन करता है, तो दूसरे को यह कैसे मिलेगा। क्या हमें सी # कोड में कुछ भी करने की ज़रूरत है या इसे स्वचालित रूप से .NET द्वारा लिया जाता है? फिर से Thnaks। – Frank

+1

@ फेंग: आपने मुझे गलत समझा है। मैंने यह नहीं कहा कि "अस्थिर" स्मृति उत्परिवर्तन के साइड इफेक्ट्स को रोकता है; पृथ्वी पर यह कैसे कर सकता है? इसके बजाय, "अस्थिर" * ऑर्डर * को प्रभावित करता है जिसमें उन उत्परिवर्तन संभवतः * मनाए जाने वाले * हो सकते हैं। यह वैरिएबल पढ़ने और लिखने पर अर्थशास्त्र को प्राप्त करने और रिलीज करने के द्वारा ऐसा करता है। ** अगर आपको समझ में नहीं आता कि सेमेन्टिक्स कैसे काम करते हैं और रिलीज करते हैं तो आपको अस्थिरता का उपयोग नहीं करना चाहिए। ** ऐसा करने के लिए यह कैशिंग अनुकूलन भी बंद कर देता है। –

1

देखो।

उस साइट पर सूत्रण के पूरे हिस्से के एक वैसे भी पढ़ा जाना चाहिए, यह है कि मुझे के लिए बहुत उपयोगी साबित कर दिया है जब मैं बहु लड़ी सॉफ्टवेयर को डिजाइन किया गया था उपयोगी जानकारी के भारी मात्रा में होता है।