दूसरे शब्दों में, क्या मैं एक अस्थिर चर के साथ कुछ कर सकता हूं जिसे सामान्य चर और इंटरलाक्ड क्लास के साथ भी हल नहीं किया जा सकता है?इंटरलाक्ड क्लास का उपयोग करने के विपरीत अस्थिर कीवर्ड का उपयोग करने का कोई फायदा है?
उत्तर
संपादित करें: प्रश्न काफी हद तक
फिर से लिखा इस सवाल का जवाब करने के लिए, मैं इस मामले में आगे थोड़ा डुबकी लगाई और volatile
और Interlocked
है कि मैं के बारे में पता नहीं था के बारे में कुछ बातें पता चला। के बाहर स्पष्ट है कि न केवल मेरे लिए, लेकिन इस चर्चा और अन्य लोगों को इस पर पढ़ने के लिए करते हैं:
volatile
पढ़ें/लिखें पुनर्व्यवस्था के लिए प्रतिरक्षा होना चाहिए रहे हैं। यह केवल का अर्थ है पढ़ने और लिखना, यह का मतलब कोई अन्य कार्रवाई नहीं है;- अस्थिरता, सीपीयू पर बाध्य नहीं किया गया जैसे कि, हार्डवेयर स्तर (x86 अधिग्रहण और किसी भी पढ़ें/लिखें पर बाड़ रिलीज का उपयोग करता है)। यह कंपाइलर या सीएलआर अनुकूलन को रोकता है;
Interlocked
तुलना एक्सचेंज (cmpxchg
) के लिए परमाणु असेंबली निर्देशों का उपयोग करता है, वृद्धि (inc
) आदि;Interlocked
का उपयोग कभी-कभी लॉक का उपयोग करता है: hardware lock on multi processor systems; यूनी-प्रोसेसर सिस्टम में, कोई हार्डवेयर लॉक नहीं है;Interlocked
volatile
से अलग है जिसमें यह पूर्ण बाड़ का उपयोग करता है, जहां अस्थिर आधे बाड़ का उपयोग करता है।- A read following a write can be reordered जब आप
volatile
का उपयोग करते हैं। यहInterlocked
के साथ नहीं हो सकता है।VolatileRead
औरVolatileWrite
में वही रीडरिंग समस्या है जो 'अस्थिर (ब्रायन गिडियन के लिए लिंक धन्यवाद) है।
अब हम नियम है कि, हम आपके प्रश्न का उत्तर परिभाषित कर सकते हैं:
- तकनीकी तौर पर:
-
: हाँ, वहाँ बातें आप
- सिंटेक्स: आप
a = b
नहीं लिख सकते हैं जहांa
याb
अस्थिर है, लेकिन यह स्पष्ट है; - पुनर्वितरण के कारण आप इसे अस्थिर चर में लिखने के बाद एक अलग मान पढ़ सकते हैं। आप
Interlocked
के साथ ऐसा नहीं कर सकते हैं। दूसरे शब्दों में: आप कमvolatile
से सुरक्षित हो सकते हैं तो आपInterlocked
के साथ हो सकते हैं। - प्रदर्शन:
volatile
Interlocked
तेज है।
volatile
साथ कर सकते हैं कि आपInterlocked
साथ नहीं कर सकते हैं - सिंटेक्स: आप
शब्दार्थ: नहीं, क्योंकि
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 मल्टीथ्रेड प्रोग्राम जो फ़ील्ड को जैसे सिंक्रनाइज़ेशन के बिना एक्सेस करते हैं जो लॉक-कथन द्वारा प्रदान किया गया है। इन अनुकूलन को रनटाइम सिस्टम, या हार्डवेयर द्वारा संकलक संकलक द्वारा किया जा सकता है।अस्थिर क्षेत्रों के लिए, ऐसे पुनर्व्यवस्था अनुकूलन प्रतिबंधित कर रहे हैं:
एक अस्थिर क्षेत्र की एक पढ़ी एक अस्थिर पढ़ कहा जाता है। एक अस्थिर पढ़ गया है:। अर्थ विज्ञान "प्राप्त हैं, अर्थात, यह स्मृति के लिए किसी भी संदर्भ यह अनुदेश अनुक्रम में बाद हो से पहले होने की गारंटी है
- +०१२३५१६४१०६१
एक अस्थिर क्षेत्र के एक लिखने एक कहा जाता है । अस्थिर लिखने एक अस्थिर लिखने " अर्थ विज्ञान रिलीज" है;। वह यह है कि यह गारंटी है होने की बाद किसी भी स्मृति का संदर्भ अनुदेश अनुक्रम में लिखने अनुदेश से पहले
अद्यतन: सवाल काफी हद तक फिर से लिखा, मेरे मूल प्रतिक्रिया को सही है और एक 'असली' जवाब
इंटरलाक्ड क्लास को लॉक के साथ बहुत कुछ नहीं करना पड़ता है और इसमें (लॉक के विपरीत) बहुत अधिक ओवरहेड नहीं है - अधिकांश सीपीयू पर इंटरलाक्ड विधियों को एकल निर्देश के रूप में लागू किया जाता है। – codymanix
आप सही हैं, इस पर इशारा करने के लिए धन्यवाद। 'तुलना एक्सचेंज' (यह सोचकर कि यह परमाणु नहीं होगा) एसएससीएलआई (साझा स्रोत सीएलआई) दिखाता है कि यह अंततः x86 प्रोसेसर पर 'cmpxchg' असेंबली निर्देश में अनुवाद करता है, और वह निर्देश है - 'इंटरलाक्ड' में कुछ और के रूप में - वास्तव में परमाणु। – Abel
कि, और अन्य सुधार, प्लस फिर से लिखने के जवाब में हैं :) – Abel
हां - आप सीधे मूल्य को देख सकते हैं।
जब तक आप केवल वैरिएबल तक पहुंचने के लिए इंटरलाक्ड क्लास का उपयोग करते हैं तो कोई फर्क नहीं पड़ता। अस्थिर क्या यह संकलक को बताता है कि चर विशिष्ट है और इसे अनुकूलित करने पर यह मानना नहीं चाहिए कि मान नहीं बदला है।
इस पाश ले जाता है:
bool done = false;
...
while(!done)
{
... do stuff which the compiler can prove doesn't touch done...
}
आप एक और धागा आप पाश से बाहर निकलने की उम्मीद करेंगे में true
को done
सेट करते हैं। हालांकि - यदि किया जाता है तो volatile
के रूप में चिह्नित नहीं किया गया है तो संकलक के पास यह एहसास करने का विकल्प है कि लूप कोड done
कभी नहीं बदल सकता है और यह बाहर निकलने के लिए तुलना को अनुकूलित कर सकता है।
यह मल्टीथ्रेड प्रोग्रामिंग के बारे में कठिन चीजों में से एक है - कई स्थितियों में समस्याएं केवल कुछ स्थितियों में आती हैं।
आप Interlocked.Read() के साथ ऐसा ही कर सकते हैं। – codymanix
अस्थिरता का आपका विवरण थोड़ा गलत है। आप सी ++ अस्थिर का वर्णन करते हैं (मल्टीथ्रेडिंग के लिए कोई अच्छा नहीं)। सी # (और जावा) अस्थिर चर का उपयोग करते समय संकलक सम्मिलित सिंक ऑपरेशन बनाते हैं। Syncs के कारण, यह हर बार चर को फिर से पढ़ने के लिए मजबूर किया जाता है, जिसका प्रभाव सी ++ के अस्थिर के समान होता है। –
जोड़ा यह एक काफी जटिल विषय है। मुझे जोसेफ अल्बाहारी के writeup को .NET Framework में मल्टीथ्रेडिंग अवधारणाओं के लिए अधिक निश्चित और सटीक स्रोतों में से एक माना जाता है जो आपके प्रश्न का उत्तर देने में मदद कर सकता है।
लेकिन, जल्दी से सारांशित करने के लिए volatile
कीवर्ड और Interlocked
कक्षा के बीच बहुत अधिक ओवरलैप है जहां तक उनका उपयोग किया जा सकता है। और निश्चित रूप से दोनों एक सामान्य चर के साथ आप क्या कर सकते हैं ऊपर और परे रास्ता जा सकते हैं।
बहुत अच्छा लेख! इसे पढ़ने के लिए कुछ समय लगेगा और इसे पूरी तरह से समझने के लिए बहुत अधिक समय लगेगा – codymanix
मैं इस विषय पर एक प्राधिकारी बनने का प्रयास नहीं करूंगा लेकिन मैं अत्यधिक अनुशंसा करता हूं कि आप विनोटेड जॉन स्कीट द्वारा this article पर एक नज़र डालें।
this answer के अंतिम भाग पर भी नज़र डालें, जो विवरण volatile
के लिए उपयोग किया जाना चाहिए।
स्कीट का लेख अच्छा है लेकिन मूल बातें ही हैं। मुझे पता है कि अस्थिर के लिए क्या अच्छा है, लेकिन सवाल यह था कि क्या ऐसी कोई स्थिति है जहां आप एक इंटरलॉक विधि के साथ अस्थिरता को प्रतिस्थापित नहीं कर सकते? – codymanix
हां, आप लॉक के बजाय अस्थिर चर का उपयोग कर कुछ प्रदर्शन प्राप्त कर सकते हैं।
लॉक एक पूर्ण मेमोरी बाधा है जो आपको अस्थिर चर के साथ-साथ कई अन्य विशेषताओं को भी दे सकता है। जैसा कि पहले से ही अस्थिर कहा गया है, यह सुनिश्चित करता है कि बहु-थ्रेडेड परिदृश्यों में यदि कोई सीपीयू अपनी कैश लाइन में कोई मान बदलता है, तो अन्य CPUs तुरंत मान देखता है लेकिन किसी भी लॉकिंग अर्थपूर्ण को सुनिश्चित नहीं करता है।
चीज लॉक अस्थिरता से बहुत अधिक शक्तिशाली है और जब आप अनावश्यक ताले से बचने के लिए अस्थिरता का उपयोग करना चाहिए।
मैं लॉक स्टेटमेंट के बारे में बात नहीं कर रहा था, लेकिन इंटरलाक्ड क्लास, लेकिन हाँ जो आपने कहा वह सच है – codymanix
- 1. क्या ऑब्जेक्ट इनिशिलाइज़र का उपयोग करने का कोई फायदा है?
- 2. अस्थिर कीवर्ड का उपयोग क्या है?
- 3. "लिंक के रूप में जोड़ें" का उपयोग करने के बजाय पोर्टेबल क्लास लाइब्रेरी का उपयोग करने का क्या फायदा है?
- 4. क्या पाइथन कक्षा का उपयोग करने में कोई फायदा है?
- 5. क्या ऑब्जेक्ट पर संपत्ति घोषित करने के बजाए प्रोटोटाइप का उपयोग करने का कोई फायदा है?
- 6. टेक्स्टबॉक्स पर RichTextBox का उपयोग करने का क्या फायदा है?
- 7. सरणी का उपयोग करने से arrayWithCapacity का उपयोग करने का क्या फायदा है?
- 8. पायथन वर्चुअलबॉक्स एपीआई का उपयोग करने का क्या फायदा है?
- 9. इंटरलाक्ड और अस्थिर
- 10. क्या '* 2' के बजाय '<< 1' का उपयोग करने का कोई फायदा है?
- 11. क्या रिटर्न स्टेटमेंट का उपयोग करने का कोई फायदा है जो कुछ भी नहीं देता है?
- 12. जावास्क्रिप्ट लोड करने के लिए document.write पर unescape का उपयोग करने का क्या फायदा है?
- 13. क्या सीएसएस में बहुत विशिष्ट चयनकर्ताओं का उपयोग करने का कोई फायदा है?
- 14. क्या गिट svn क्लोन में --no-metadata का उपयोग करने का कोई फायदा है?
- 15. क्या एएसपी.नेट में सिक्योरस्ट्रिंग का उपयोग करने का कोई फायदा है?
- 16. क्या पर्ल या पायथन पर बैश का उपयोग करने का कोई फायदा है?
- 17. क्या पीजीपी का उपयोग करके दो बार एन्क्रिप्ट करने का कोई फायदा है?
- 18. क्या PHP में पहले शून्य का उपयोग करने का कोई फायदा है?
- 19. क्या एमवीसी में एचटीएमएलहेल्पर का उपयोग करने का कोई फायदा है?
- 20. क्या एंड एंड ओ एंड एंड और || का उपयोग करने का कोई फायदा है PHP में?
- 21. क्या मानक सी ++ या सी # पर सी ++/सीएलआई का उपयोग करने का कोई फायदा है?
- 22. उद्देश्य-सी में कार्यों पर ब्लॉक का उपयोग करने का कोई फायदा है?
- 23. जारी करने पर फ़िल्टर_has_var() का उपयोग करने का क्या फायदा है()
- 24. क्या यह टेम्पलेट्स के साथ इनलाइन कीवर्ड का उपयोग करने का कोई अर्थ है?
- 25. सी # में अस्थिर कीवर्ड का उपयोग कब किया जाना चाहिए?
- 26. क्या जावास्क्रिप्ट पुस्तकालयों को लोड करने के लिए सार्वजनिक सीडीएन का उपयोग न करने का कोई फायदा है?
- 27. एक उपयोगकर्तास्क्रिप्ट में, querySelector() बनाम jQuery के $() का उपयोग करने के लिए कोई फायदा है?
- 28. VARCHAR पर CHAR का उपयोग करने का कोई लाभ?
- 29. Node.js के लिए NginX का उपयोग करने का क्या फायदा है?
- 30. जैस्मीन के स्पाइज़ में निर्मित Sinon.js का उपयोग करने का क्या फायदा है?
मुझे पता है कि अस्थिर के लिए क्या अच्छा है। सवाल यह है कि अगर ऐसी कोई स्थिति है जहां आप एक इंटरलॉक विधि के साथ अस्थिरता को प्रतिस्थापित नहीं कर सकते हैं? – codymanix