2009-12-05 14 views
9

मुझे अस्थिर वस्तुओं के साथ एक सरणी की आवश्यकता है, और ऐसा करने का कोई तरीका नहीं मिल रहा है।सी # अस्थिर सरणी आइटम?

private volatile T[] _arr; 

इसका मतलब है कि _arr संदर्भ अस्थिर है, हालांकि यह _arr ऑब्जेक्ट के अंदर वस्तुओं के बारे में कुछ भी गारंटी नहीं देता है।

क्या _arr के आइटम को अस्थिर के रूप में चिह्नित करने का कोई तरीका है?

धन्यवाद।

संपादित करें:

निम्नलिखित कोड binarycoder के जवाब के अनुसार बनाया गया। क्या यह कोड उपयोग करने के लिए थ्रेड-सुरक्षित है?

public class VolatileArray<T> 
{ 
    private T[] _arr; 

    public VolatileArray(int length) 
    { 
     _arr = new T[length]; 
    } 

    public VolatileArray(T[] arr) 
    { 
     _arr = arr; 
    } 

    public T this[int index] 
    { 
     get 
     { 
      T value = _arr[index]; 
      Thread.MemoryBarrier(); 
      return value; 
     } 

     set 
     { 
      Thread.MemoryBarrier(); 
      _arr[index] = value; 
     } 
    } 

    public int Length 
    { 
     get { return _arr.Length; } 
    } 
} 
+2

इस प्रश्न को अधिक प्यार की आवश्यकता है। –

उत्तर

7

चूंकि यह संदर्भ द्वारा सरणी तत्वों पारित करने के लिए संभव है, आप Thread.VolatileRead और Thread.VolatileWrite उपयोग कर सकते हैं।

यह समझने में उपयोगी है कि volatile कीवर्ड Thread.MemoryBarrier का उपयोग करके दृश्यों के पीछे काम करता है। आप लिख सकते हैं:

// Read 
x = _arr[i]; 
Thread.MemoryBarrier(); 

// Write 
Thread.MemoryBarrier(); 
_arr[i] = x; 

ध्यान दें कि volatile और MemoryBarrier उन्नत तकनीक है कि दोनों गलत करने के लिए आसान कर रहे हैं। उदाहरण के लिए, How do I Understand Read Memory Barriers and Volatile देखें। आम तौर पर आप lock, Monitor, ReaderWriterLockSlim, और अन्य जैसे उच्च स्तरीय संरचनाओं के साथ बेहतर होते हैं।

+0

आईआईआरसी, फिर सख्ती से, 'अस्थिर' कीवर्ड में केवल एक पढ़ने या लिखने की बाधा उचित होती है, जबकि 'थ्रेड.मेमरीबैरियर()' में पूर्ण बाधा होती है। इससे पहले कि हम मानते हैं कि इसमें एक विधि कॉल शामिल है, इससे पहले भी उपरोक्त 'अस्थिर' के बराबर उपयोग से थोड़ा भारी है। यह अभी भी सबसे अच्छा है जो हम कर सकते हैं (और जैसा कि आप कहते हैं, 'VolatileRead() 'और' VolatileWrite() 'का वर्तमान कार्यान्वयन)। –

1

मुझे नहीं लगता कि आप

आप नहीं, volatile एक क्षेत्र संशोधक (ECMA 334) के रूप में परिभाषित किया गया है सकते हैं कर सकते हैं।

और मुझे नहीं लगता कि यह आपके द्वारा प्राप्त की जाने वाली चीज़ों को पूरा करेगा।
पर विचार करें:

private T[] _arr; 

volatile T v; 
.... v = _arr[x]; 
.... _arr[x] = v; 
1

मैं एक छोटे से struct मदद करता है कि चीजों को साफ रखने और OO

struct VolatileBoolean { 
    public volatile Boolean Value; 
} 

VolatileBoolean[] arrayOfVolatileBooleans; 
public void SomeMethod() { 
    if (arrayOfVolatileBooleans[4].Value) 
     DoSomething(); 
} 
2

उपयोग Volatile.Read(ref array[index]) और Volatile.Write(ref array[index], value) बनाया है।

कक्षा Volatile .NET 4.5 के बाद उपलब्ध है। यह फ़ील्ड, एरे तत्वों, ref पैरामीटर, पॉइंटर्स से/पढ़ने/लिखने की अनुमति देता है।

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