2009-02-10 15 views
10

केवल संदर्भ प्रकार और कुछ प्राइमेटिव (फ्लोट सहित, लेकिन डबल नहीं, मुझे यकीन नहीं है कि क्यों, मुझे सुनकर खुशी हो रही है) क्यों अस्थिर के रूप में घोषित किया जा सकता है, अगर मैं दोहरा लपेटता हूं एक वर्ग में फिर इसे अस्थिर (नीचे के रूप में) घोषित करें, क्या डबल प्रॉपर्टी किसी अन्य अस्थिर के रूप में 'पठन लिखने' थ्रेड सुरक्षित होगी, या क्या मुझे अभी भी लॉक लगाना चाहिए?सी # अस्थिर डबल

public class MyThreadedClass 
{ 
    volatile VolatileDouble voldub; 
} 

public class VolatileDouble 
{ 
    public double Double { get; set; } 
} 

उत्तर

16

कारण क्यों डबल अस्थिर घोषित नहीं किया जा सकता है: यह 64 बिट्स है, जो इसे 86 पर शब्द आकार है, जो यह CLI में अस्थिर घोषित होने से रोकती है अगर मैं सही ढंग से याद है और अधिक से अधिक बनाता है।

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

मैं अगर मैं तुम थे ताला लगा के साथ जाना चाहते हैं, लेकिन एक विकल्प Interlocked.Read और Interlocked.ExchangeBitConverter.Int64BitsToDouble और BitConverter.DoubleToInt64Bits साथ देशांतर पर अभिनय, संयोजन के रूप में उपयोग करने के लिए है। आप इसे VolatileDouble संरचना के भीतर encapsulate कर सकते हैं। (मैं शायद इसे कक्षा के बजाय एक संरचना बना दूंगा।)

+0

को शक था कि केवल संदर्भ अस्थिर था, इसलिए प्रश्न का प्रकार। पुष्टिकरण – johnc

+0

के लिए धन्यवाद अगर उसने यह सुनिश्चित किया कि वोल्टाइल डबल दो अपरिवर्तनीय है तो उसे समस्याएं नहीं होनी चाहिए, सही? –

+0

इंटरलाक्ड और बिटकॉन्टर सुझावों के लिए भी धन्यवाद, विचार – johnc

5

उपर्युक्त काम करने के लिए, आपको इसे अपरिवर्तनीय (कोई सेटटर) नहीं होना चाहिए - शायद सुविधा के लिए कुछ अंतर्निहित रूपांतरण ऑपरेटरों के साथ। अन्यथा, लोग (अस्थिर) संदर्भ को बदलने के बिना मूल्य बदल सकते हैं।

public class MyThreadedClass 
{ 
    volatile Box<double> volDouble = 123.45; 
} 

public class Box<T> where T : struct 
{ 
    private readonly T value; 
    public Box(T value) { this.value = value; } 
    public T Value {get {return value;}} 

    // explicit as nulls are a problem... 
    public static explicit operator T(Box<T> box) { 
     return box.value; } 
    public static implicit operator T?(Box<T> box) { 
     return box == null ? new T?() : new T?(box.value); } 
    public static implicit operator Box<T>(T value) { 
     return new Box<T>(value); } 
    public static implicit operator Box<T>(T? value) { 
     return value.HasValue ? new Box<T>(value.Value) : null; } 
} 

इसके अलावा - लॉकिंग सबसे अच्छा विकल्प होगा।

+0

क्या आपका मतलब कोई सेटटर नहीं है? –

+0

मैं करता हूं ;-p (ओओएस!) –

+0

अच्छा कोड, लेकिन मुझे लगता है कि मैं – johnc

3

आप केवल यह घोषणा कर रहे हैं कि संदर्भ अस्थिर नहीं है, इसलिए समस्या हल नहीं होगी।

+0

संदेह है, इसलिए सवाल, पुष्टि के लिए धन्यवाद – johnc

0

अस्थिर प्रलेखन कुछ कैसे भ्रामक ...

जब MSDN प्रलेखन कहना है कि यह तिथि मूल्य अप करने के लिए सबसे उपयोग करता इसका मतलब क्या है ??? मुझे यकीन है कि एक साधारण मूल्य में यह भ्रम पैदा नहीं करता है, लेकिन संदर्भ के बारे में क्या है, ब्रायन रasmुसेन के रूप में आप वास्तविक उदाहरण (और इसलिए दिलचस्प डेटा) को रेफरी करने के बारे में बात कर रहे हैं।

अस्थिर का उपयोग कर देखने की मेरी बात से एक अच्छा विचार नहीं है और मैं ताला के लिए जाना चाहते हैं, वैसे भी इस लेख में आपकी मदद कर सकता है: http://www.bluebytesoftware.com/blog/PermaLink,guid,dd3aff8a-7f8d-4de6-a2e7-d199662b68f4.aspx

संबंधित मुद्दे