2009-11-09 15 views
8

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

+0

मुझे पता है कि अस्थिर के लिए क्या अच्छा है। सवाल यह है कि अगर ऐसी कोई स्थिति है जहां आप एक इंटरलॉक विधि के साथ अस्थिरता को प्रतिस्थापित नहीं कर सकते हैं? – codymanix

उत्तर

15

संपादित करें: प्रश्न काफी हद तक

फिर से लिखा इस सवाल का जवाब करने के लिए, मैं इस मामले में आगे थोड़ा डुबकी लगाई और volatile और Interlocked है कि मैं के बारे में पता नहीं था के बारे में कुछ बातें पता चला। के बाहर स्पष्ट है कि न केवल मेरे लिए, लेकिन इस चर्चा और अन्य लोगों को इस पर पढ़ने के लिए करते हैं:

  • volatile पढ़ें/लिखें पुनर्व्यवस्था के लिए प्रतिरक्षा होना चाहिए रहे हैं। यह केवल का अर्थ है पढ़ने और लिखना, यह का मतलब कोई अन्य कार्रवाई नहीं है;
  • अस्थिरता, सीपीयू पर बाध्य नहीं किया गया जैसे कि, हार्डवेयर स्तर (x86 अधिग्रहण और किसी भी पढ़ें/लिखें पर बाड़ रिलीज का उपयोग करता है)। यह कंपाइलर या सीएलआर अनुकूलन को रोकता है;
  • Interlocked तुलना एक्सचेंज (cmpxchg) के लिए परमाणु असेंबली निर्देशों का उपयोग करता है, वृद्धि (inc) आदि;
  • Interlocked का उपयोग कभी-कभी लॉक का उपयोग करता है: hardware lock on multi processor systems; यूनी-प्रोसेसर सिस्टम में, कोई हार्डवेयर लॉक नहीं है;
  • Interlockedvolatile से अलग है जिसमें यह पूर्ण बाड़ का उपयोग करता है, जहां अस्थिर आधे बाड़ का उपयोग करता है।
  • A read following a write can be reordered जब आप volatile का उपयोग करते हैं। यह Interlocked के साथ नहीं हो सकता है। VolatileRead और VolatileWrite में वही रीडरिंग समस्या है जो 'अस्थिर (ब्रायन गिडियन के लिए लिंक धन्यवाद) है।

अब हम नियम है कि, हम आपके प्रश्न का उत्तर परिभाषित कर सकते हैं:

  • तकनीकी तौर पर:
      : हाँ, वहाँ बातें आप volatile साथ कर सकते हैं कि आप Interlocked साथ नहीं कर सकते हैं
    1. सिंटेक्स: आप a = b नहीं लिख सकते हैं जहां a या b अस्थिर है, लेकिन यह स्पष्ट है;
    2. पुनर्वितरण के कारण आप इसे अस्थिर चर में लिखने के बाद एक अलग मान पढ़ सकते हैं। आप Interlocked के साथ ऐसा नहीं कर सकते हैं। दूसरे शब्दों में: आप कमvolatile से सुरक्षित हो सकते हैं तो आप Interlocked के साथ हो सकते हैं।
    3. प्रदर्शन: volatileInterlocked तेज है।
  • शब्दार्थ: नहीं, क्योंकि Interlocked बस संचालन का सुपरसेट प्रदान करता है और उपयोग करने के लिए सुरक्षित है, क्योंकि यह पूर्ण बाड़ लगाने लागू होता है। आप volatile के साथ कुछ भी है कि आप Interlocked साथ नहीं कर सकते ऐसा नहीं कर सकते हैं और आप एक बहुत Interlocked साथ कि आप अस्थिर साथ नहीं कर सकते कर सकते हैं:

    static volatile int x = 0; 
    x++;      // non-atomic 
    static int y = 0; 
    Interlocked.Increment(y); // atomic 
    
  • स्कोप: हाँ, की घोषणा एक चर volatile यह अस्थिर बनाता है प्रत्येक एकल पहुंच के लिए। इस व्यवहार को किसी भी अन्य तरीके से मजबूर करना असंभव है, इसलिए volatile को Interlocked के साथ प्रतिस्थापित नहीं किया जा सकता है। परिदृश्यों में इसकी आवश्यकता होती है जहां अन्य पुस्तकालय, इंटरफेस या हार्डवेयर आपके चर का उपयोग कर सकते हैं और इसे किसी भी समय अपडेट कर सकते हैं, या नवीनतम संस्करण की आवश्यकता है।

यदि आप मुझसे पूछें चाहते हैं, यह पिछले सा volatile के लिए वास्तविक वास्तविक आवश्यकता है और जहां दो प्रक्रियाओं स्मृति का हिस्सा है और पढ़ने के लिए या ताला लगा के बिना लिखने की ज़रूरत यह आदर्श बना सकते हैं। volatile के रूप में एक चर घोषित करना इस संदर्भ में अधिक सुरक्षित है, फिर सभी प्रोग्रामर को Interlocked (जिसे आप कंपाइलर द्वारा बल नहीं दे सकते) का उपयोग करने के लिए मजबूर कर रहे हैं।


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

: निम्नलिखित उद्धरण मेरी मूल जवाब का हिस्सा था, मैं इसे ;-)

में एक उद्धरण सी # प्रोग्रामिंग भाषा मानक से छोड़ देंगे

nonvolatile फ़ील्ड के लिए, ऑप्टिमाइज़ेशन तकनीकें जो मानते हैं कि निर्देशों को अप्रत्याशित और अप्रत्याशित परिणाम हो सकता है I n मल्टीथ्रेड प्रोग्राम जो फ़ील्ड को जैसे सिंक्रनाइज़ेशन के बिना एक्सेस करते हैं जो लॉक-कथन द्वारा प्रदान किया गया है। इन अनुकूलन को रनटाइम सिस्टम, या हार्डवेयर द्वारा संकलक संकलक द्वारा किया जा सकता है।अस्थिर क्षेत्रों के लिए, ऐसे पुनर्व्यवस्था अनुकूलन प्रतिबंधित कर रहे हैं:

  • एक अस्थिर क्षेत्र की एक पढ़ी एक अस्थिर पढ़ कहा जाता है। एक अस्थिर पढ़ गया है:। अर्थ विज्ञान "प्राप्त हैं, अर्थात, यह स्मृति के लिए किसी भी संदर्भ यह अनुदेश अनुक्रम में बाद हो से पहले होने की गारंटी है

  • एक अस्थिर क्षेत्र के एक लिखने एक कहा जाता है । अस्थिर लिखने एक अस्थिर लिखने " अर्थ विज्ञान रिलीज" है;। वह यह है कि यह गारंटी है होने की बाद किसी भी स्मृति का संदर्भ अनुदेश अनुक्रम में लिखने अनुदेश से पहले

  • +०१२३५१६४१०६१

अद्यतन: सवाल काफी हद तक फिर से लिखा, मेरे मूल प्रतिक्रिया को सही है और एक 'असली' जवाब

+0

इंटरलाक्ड क्लास को लॉक के साथ बहुत कुछ नहीं करना पड़ता है और इसमें (लॉक के विपरीत) बहुत अधिक ओवरहेड नहीं है - अधिकांश सीपीयू पर इंटरलाक्ड विधियों को एकल निर्देश के रूप में लागू किया जाता है। – codymanix

+0

आप सही हैं, इस पर इशारा करने के लिए धन्यवाद। 'तुलना एक्सचेंज' (यह सोचकर कि यह परमाणु नहीं होगा) एसएससीएलआई (साझा स्रोत सीएलआई) दिखाता है कि यह अंततः x86 प्रोसेसर पर 'cmpxchg' असेंबली निर्देश में अनुवाद करता है, और वह निर्देश है - 'इंटरलाक्ड' में कुछ और के रूप में - वास्तव में परमाणु। – Abel

+0

कि, और अन्य सुधार, प्लस फिर से लिखने के जवाब में हैं :) – Abel

0

हां - आप सीधे मूल्य को देख सकते हैं।

जब तक आप केवल वैरिएबल तक पहुंचने के लिए इंटरलाक्ड क्लास का उपयोग करते हैं तो कोई फर्क नहीं पड़ता। अस्थिर क्या यह संकलक को बताता है कि चर विशिष्ट है और इसे अनुकूलित करने पर यह मानना ​​नहीं चाहिए कि मान नहीं बदला है।

इस पाश ले जाता है:

bool done = false; 

... 

while(!done) 
{ 
... do stuff which the compiler can prove doesn't touch done... 
} 

आप एक और धागा आप पाश से बाहर निकलने की उम्मीद करेंगे में true को done सेट करते हैं। हालांकि - यदि किया जाता है तो volatile के रूप में चिह्नित नहीं किया गया है तो संकलक के पास यह एहसास करने का विकल्प है कि लूप कोड done कभी नहीं बदल सकता है और यह बाहर निकलने के लिए तुलना को अनुकूलित कर सकता है।

यह मल्टीथ्रेड प्रोग्रामिंग के बारे में कठिन चीजों में से एक है - कई स्थितियों में समस्याएं केवल कुछ स्थितियों में आती हैं।

+0

आप Interlocked.Read() के साथ ऐसा ही कर सकते हैं। – codymanix

+1

अस्थिरता का आपका विवरण थोड़ा गलत है। आप सी ++ अस्थिर का वर्णन करते हैं (मल्टीथ्रेडिंग के लिए कोई अच्छा नहीं)। सी # (और जावा) अस्थिर चर का उपयोग करते समय संकलक सम्मिलित सिंक ऑपरेशन बनाते हैं। Syncs के कारण, यह हर बार चर को फिर से पढ़ने के लिए मजबूर किया जाता है, जिसका प्रभाव सी ++ के अस्थिर के समान होता है। –

1

जोड़ा यह एक काफी जटिल विषय है। मुझे जोसेफ अल्बाहारी के writeup को .NET Framework में मल्टीथ्रेडिंग अवधारणाओं के लिए अधिक निश्चित और सटीक स्रोतों में से एक माना जाता है जो आपके प्रश्न का उत्तर देने में मदद कर सकता है।

लेकिन, जल्दी से सारांशित करने के लिए volatile कीवर्ड और Interlocked कक्षा के बीच बहुत अधिक ओवरलैप है जहां तक ​​उनका उपयोग किया जा सकता है। और निश्चित रूप से दोनों एक सामान्य चर के साथ आप क्या कर सकते हैं ऊपर और परे रास्ता जा सकते हैं।

+0

बहुत अच्छा लेख! इसे पढ़ने के लिए कुछ समय लगेगा और इसे पूरी तरह से समझने के लिए बहुत अधिक समय लगेगा – codymanix

0

मैं इस विषय पर एक प्राधिकारी बनने का प्रयास नहीं करूंगा लेकिन मैं अत्यधिक अनुशंसा करता हूं कि आप विनोटेड जॉन स्कीट द्वारा this article पर एक नज़र डालें।

this answer के अंतिम भाग पर भी नज़र डालें, जो विवरण volatile के लिए उपयोग किया जाना चाहिए।

+0

स्कीट का लेख अच्छा है लेकिन मूल बातें ही हैं। मुझे पता है कि अस्थिर के लिए क्या अच्छा है, लेकिन सवाल यह था कि क्या ऐसी कोई स्थिति है जहां आप एक इंटरलॉक विधि के साथ अस्थिरता को प्रतिस्थापित नहीं कर सकते? – codymanix

-1

हां, आप लॉक के बजाय अस्थिर चर का उपयोग कर कुछ प्रदर्शन प्राप्त कर सकते हैं।

लॉक एक पूर्ण मेमोरी बाधा है जो आपको अस्थिर चर के साथ-साथ कई अन्य विशेषताओं को भी दे सकता है। जैसा कि पहले से ही अस्थिर कहा गया है, यह सुनिश्चित करता है कि बहु-थ्रेडेड परिदृश्यों में यदि कोई सीपीयू अपनी कैश लाइन में कोई मान बदलता है, तो अन्य CPUs तुरंत मान देखता है लेकिन किसी भी लॉकिंग अर्थपूर्ण को सुनिश्चित नहीं करता है।

चीज लॉक अस्थिरता से बहुत अधिक शक्तिशाली है और जब आप अनावश्यक ताले से बचने के लिए अस्थिरता का उपयोग करना चाहिए।

+0

मैं लॉक स्टेटमेंट के बारे में बात नहीं कर रहा था, लेकिन इंटरलाक्ड क्लास, लेकिन हाँ जो आपने कहा वह सच है – codymanix

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

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