वोलेटाइल (कंप्यूटर प्रोग्रामिंग): Difference between revisions
m (Abhishek moved page वाष्पशील (कंप्यूटर प्रोग्रामिंग) to वोलेटाइल (कंप्यूटर प्रोग्रामिंग) without leaving a redirect) |
No edit summary |
||
(4 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
{{Short description|A keyword used in some programming languages to tag variables}} | {{Short description|A keyword used in some programming languages to tag variables}} | ||
{{Lowercase title}} | {{Lowercase title}} | ||
[[कंप्यूटर प्रोग्रामिंग]] में वोलेटाइल का अर्थ | [[कंप्यूटर प्रोग्रामिंग]] में वोलेटाइल का अर्थ कोड के अनियंत्रित होने व समय के साथ उनके मूल्य के परिवर्तित होने की संभावना है। वोलेटाइल का कार्य कॉलिंग परिपाटियों के भीतर निहितार्थ है और यह चरों को कैसे संग्रहण, अभिगम और और कैच किया जाय इस पर भी प्रभाव डालता है। | ||
C ([[ प्रोग्रामिंग भाषा ]]), [[C++]], C# और Java प्रोग्रामिंग भाषा में वोलेटाइल [[कीवर्ड (कंप्यूटर प्रोग्रामिंग)]] इंगित करता है कि | C ([[ प्रोग्रामिंग भाषा ]]), [[C++]], C# और Java (जावा) प्रोग्रामिंग भाषा में वोलेटाइल [[कीवर्ड (कंप्यूटर प्रोग्रामिंग)|संकेतशब्द (कंप्यूटर प्रोग्रामिंग)]] इंगित करता है कि [[ मूल्य (कंप्यूटर विज्ञान) |वैल्यू (कंप्यूटर विज्ञान)]] भिन्न-भिन्न एक्सेस के मध्य परिवर्तित हो सकती है भले ही यह संशोधित प्रतीत न हो। यह संकेतशब्द [[अनुकूलन संकलक]] को बाद के रीड्स या राइट्स को इसके अनुकूल होने से रोकता है और इस प्रकार अशुद्ध रूप से पुराने मान का पुन: उपयोग करता है या राइट्स को छोड़ देता है। वोलेटाइल मान मुख्य रूप से हार्डवेयर एक्सेस (मेमोरी-मैप्ड I/O) में उत्पन्न होते हैं जहां मेमोरी से पढ़ने या लिखने का उपयोग [[परिधीय उपकरण|परिधीय उपकरणों (संगणक के साथ जुड़े उपकरण)]] के साथ संवाद करने के लिए किया जाता है और जहां [[थ्रेड (कंप्यूटिंग)]] में अलग थ्रेड ने मान को संशोधित किया हो। | ||
सामान्य संकेत शब्द होने के उपरांत <code>volatile</code>का व्यवहार प्रोग्रामिंग भाषाओं के मध्य महत्वपूर्ण रूप से भिन्न है और | सामान्य संकेत शब्द होने के उपरांत <code>volatile</code>का व्यवहार प्रोग्रामिंग भाषाओं के मध्य महत्वपूर्ण रूप से भिन्न है और त्रुटिपूर्ण समझा जाता है। C और C ++ में यह एक प्रकार का [[क्वालीफायर टाइप करें|टाइप क्वालीफायर]] है जैसे <code>[[const (computer programming)|const]]</code>और [[डेटा प्रकार|डेटा]] एक प्रकार की संपत्ति है। इसके अतिरिक्त C और C ++ में यह अधिकांश थ्रेडिंग परिदृश्यों में काम नहीं करता है और इसका उपयोग निराशाजनक होता है। Java और C # में यह [[चर (कंप्यूटर विज्ञान)]] की संपत्ति है और इंगित करता है कि [[वस्तु (कंप्यूटर विज्ञान)]] जिसके लिए चर बाध्य है उत्परिवर्तित हो सकता है तथा विशेष रूप से थ्रेडिंग के लिए अभीष्ट है। D (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा में थ्रेडिंग उपयोग के लिए एक अलग संकेतशब्द <code>shared</code> होता है परन्तु कोई भी <code>volatile</code> संकेतशब्द उपलब्ध नहीं है। | ||
== C और C ++ में == | == C और C ++ में == | ||
C और C ++ में <code>volatile</code> | C और C ++ में <code>volatile</code> संकेतशब्द का निम्नलिखित उद्देश्य था<ref name="auto">{{cite web |title=सी++ मानक समिति पर प्रकाशन|url= http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.html}}</ref> | ||
* मेमोरी-मैप्ड I/O उपकरणों तक पहुंच की अनुमति देना। | * मेमोरी-मैप्ड I/O उपकरणों तक पहुंच की अनुमति देना। | ||
* <code>[[setjmp]]</code> और <code>longjmp</code> के मध्य | * <code>[[setjmp]]</code> और <code>longjmp</code> के मध्य चरों के उपयोग की अनुमति देना। | ||
*<code>sig_atomic_t</code> सिग्नल हैंडलर में | *<code>sig_atomic_t</code> सिग्नल हैंडलर में चरों के उपयोग की अनुमति देना। | ||
जबकि C और C ++ दोनों के द्वारा अभिप्रेत C मानक यह व्यक्त करने में विफल रहते हैं कि <code>volatile</code> सिमेंटिक्स लवल्यू को संदर्भित करता है, संदर्भित वस्तु को नहीं। संबंधित दोष रिपोर्ट DR 476 (C11 तक) अभी भी C17 (C मानक संशोधन) के साथ समीक्षाधीन है।<ref>[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2244.htm ''Clarification Request Summary for C11.''] Version 1.13, October 2017.</ref> | जबकि C और C ++ दोनों के द्वारा अभिप्रेत C मानक यह व्यक्त करने में विफल रहते हैं कि <code>volatile</code> सिमेंटिक्स लवल्यू को संदर्भित करता है, संदर्भित वस्तु को नहीं। संबंधित दोष रिपोर्ट DR 476 (C11 तक) अभी भी C17 (C मानक संशोधन) के साथ समीक्षाधीन है।<ref>[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2244.htm ''Clarification Request Summary for C11.''] Version 1.13, October 2017.</ref> | ||
<code>volatile</code> संचालन | <code>volatile</code> चरों पर संचालन [[परमाणु संचालन]] नहीं होता हैं और न ही वे थ्रेडिंग के लिए उचित होते है जोकि पहले संबंध स्थापित करते हैं। यह प्रासंगिक मानकों (C, C++, [[POSIX]], WIN32) में निर्दिष्ट है<ref name="auto" />और वोलेटाइल चर उपलब्ध कार्यान्वयन के विशाल बहुमत में थ्रेडसेफ नहीं हैं। इस प्रकार <code>volatile</code> का उपयोग पोर्टेबल सिंक्रनाइज़ेशन तंत्र के रूप में संकेतशब्द को कई C/C ++ समूहों द्वारा हतोसात्हित किया जाता है।<ref>{{cite web |title=विज़ुअल सी ++ में वाष्पशील कीवर्ड|url=http://msdn2.microsoft.com/en-us/library/12a04hfd.aspx|work=Microsoft MSDN}}</ref><ref>{{cite web |title=Linux Kernel Documentation – Why the "volatile" type class should not be used|url= https://www.kernel.org/doc/html/latest/process/volatile-considered-harmful.html|work=kernel.org}}</ref><ref>{{cite web |title=सी++ और डबल-चेक्ड लॉकिंग के खतरे|url=http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf|work=DDJ|year=2004|author1=Scott Meyers |author2= Andrei Alexandrescu}}</ref> | ||
C में मेमोरी-मैप किए गए I/O का उदाहरण | === C में मेमोरी-मैप किए गए I/O का उदाहरण === | ||
इस उदाहरण में कोड<code>foo</code> में संग्रहीत मान <code>0</code> को सेट करता है तथा यह तब तक [[मतदान (कंप्यूटर विज्ञान)|पोल (कंप्यूटर विज्ञान)]] आरम्भ करता है जब तक कि इसे परिवर्तित होने तक बार-बार <code>255</code> मूल्य नहीं मिलता: | इस उदाहरण में कोड<code>foo</code> में संग्रहीत मान <code>0</code> को सेट करता है तथा यह तब तक [[मतदान (कंप्यूटर विज्ञान)|पोल (कंप्यूटर विज्ञान)]] आरम्भ करता है जब तक कि इसे परिवर्तित होने तक बार-बार <code>255</code> मूल्य नहीं मिलता: | ||
Line 33: | Line 32: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
ऑप्टिमाइज़िंग कंपाइलर | ऑप्टिमाइज़िंग कंपाइलर इस बात का ध्यान रखता है कि कोई अन्य कोड संभवतः संग्रहीत मान <code>foo</code> को परिवर्तित नहीं कर सकता है और मानता है कि यह <code>0</code> हर समय बराबर रहेगा। इसलिए कंपाइलर फ़ंक्शन बॉडी को इसके समान [[अनंत लूप]] से प्रतिस्थापित कर देता है: | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
Line 43: | Line 42: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
जबकि <code>foo</code> ऐसे स्थान का प्रतिनिधित्व कर सकता है जिसे किसी भी समय कंप्यूटर सिस्टम के अन्य तत्वों द्वारा परिवर्तित किया जा सकता है, जैसे कि [[ CPU ]] से जुड़े उपकरण का [[हार्डवेयर रजिस्टर]]। उपरोक्त कोड ऐसे परिवर्तन का कभी पता नहीं लगाएगा; <code>volatile</code> | जबकि <code>foo</code> ऐसे स्थान का प्रतिनिधित्व कर सकता है जिसे किसी भी समय कंप्यूटर सिस्टम के अन्य तत्वों द्वारा परिवर्तित किया जा सकता है, जैसे कि [[ CPU ]] से जुड़े उपकरण का [[हार्डवेयर रजिस्टर]]। उपरोक्त कोड ऐसे परिवर्तन का कभी पता नहीं लगाएगा; <code>volatile</code> संकेतशब्द के बिना कंपाइलर मानता है कि वर्तमान प्रोग्राम सिस्टम का एकमात्र भाग है जो मूल्य को परिवर्तित सकता है (जो अब तक की सबसे सामान्य स्थिति है)। | ||
ऊपर के रूप में कोड को अनुकूलित करने से संकलक को रोकने के लिए <code>volatile</code> | ऊपर के रूप में कोड को अनुकूलित करने से संकलक को रोकने के लिए <code>volatile</code> संकेतशब्द प्रयोग किया जाता है: | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
Line 59: | Line 58: | ||
इस संशोधन के साथ लूप की स्थिति को अनुकूलित नहीं किया जाएगा और जब यह होता है तो सिस्टम परिवर्तन का पता लगाएगा। | इस संशोधन के साथ लूप की स्थिति को अनुकूलित नहीं किया जाएगा और जब यह होता है तो सिस्टम परिवर्तन का पता लगाएगा। | ||
सामान्य रूप से प्लेटफ़ॉर्म पर[[ स्मृति बाधा ]] | सामान्य रूप से प्लेटफ़ॉर्म पर[[ स्मृति बाधा ]]संचालन उपलब्ध होते हैं (जो C++11 में उजागर होते हैं) जिन्हें वोलेटाइल के अतिरिक्त प्राथमिकता दी जानी चाहिए क्योंकि वे कंपाइलर को उन्नत अनुकूलन करने की अनुमति देते हैं और इससे भी महत्वपूर्ण बात यह है कि वे बहु-थ्रेडेड परिदृश्यों में सही व्यवहार की गारंटी देते हैं; न तो C विनिर्देश (C 11 से पहले) और न ही C ++ विनिर्देश (C ++ 11 से पहले) बहु-थ्रेडेड मेमोरी मॉडल निर्दिष्ट करता है इसलिए वोलेटाइल ओएस/कंपाइलर/सीपीयू में निश्चित रूप से व्यवहार नहीं कर सकता है।<ref>{{cite web |url=http://kerneltrap.org/Linux/Volatile_Superstition|title=Linux: Volatile Superstition|publisher=kerneltrap.org|access-date=Jan 9, 2011|archive-url=https://web.archive.org/web/20100620121940/http://kerneltrap.org/Linux/Volatile_Superstition|author1=Jeremy Andrews|year=2007|archive-date=2010-06-20}}</ref> | ||
=== C में अनुकूलन तुलना === | === C में अनुकूलन तुलना === | ||
निम्नलिखित C कार्यक्रम और साथ में असेंबलर भाषा अंश प्रदर्शित करते हैं कि कैसे <code>volatile</code> | निम्नलिखित C कार्यक्रम और साथ में असेंबलर भाषा अंश प्रदर्शित करते हैं कि कैसे <code>volatile</code> संकेतशब्द कंपाइलर के आउटपुट को प्रभावित करता है। इस स्थिति में संकलक GNU संकलक संग्रह था। | ||
असेंबली कोड का अवलोकन करते समय यह स्पष्ट रूप से दिखाई देता है कि वोलेटाइल वस्तुओं से उत्पन्न कोड अधिक क्रियात्मक है जिससे इसकी प्रकृति अधिक लंबी हो जाती है जिससे <code>volatile</code> वस्तुओं की पूर्ति हो सकती है। <code>volatile</code> | असेंबली कोड का अवलोकन करते समय यह स्पष्ट रूप से दिखाई देता है कि वोलेटाइल वस्तुओं से उत्पन्न कोड अधिक क्रियात्मक है जिससे इसकी प्रकृति अधिक लंबी हो जाती है जिससे <code>volatile</code> वस्तुओं की पूर्ति हो सकती है। <code>volatile</code> संकेतशब्द संकलक को वोलेटाइल वस्तुओं से जुड़े कोड पर अनुकूलन करने से रोकता है इस प्रकार यह सुनिश्चित करता है कि प्रत्येक वोलेटाइल चर असाइनमेंट और रीड के पास एक समान मेमोरी एक्सेस हो। <code>volatile</code> के बिना संकेतशब्द संकलक जानता है कि चर को प्रत्येक उपयोग पर मेमोरी से पुनः पढ़ने की आवश्यकता नहीं है क्योंकि किसी अन्य थ्रेड या प्रक्रिया से इसकी मेमोरी स्थिति पर कोई अधिकार नहीं होना चाहिए। | ||
{|class="wikitable collapsible collapsed" width="100%" | {|class="wikitable collapsible collapsed" width="100%" | ||
Line 207: | Line 206: | ||
=== [[सी ++ 11|C ++ 11]] === | === [[सी ++ 11|C ++ 11]] === | ||
C++11 ISO मानक के अनुसार वोलेटाइल | C++11 ISO मानक के अनुसार वोलेटाइल संकेतशब्द मात्र हार्डवेयर एक्सेस के लिए उपयोग के लिए है; इंटर-थ्रेड संचार के लिए इसका उपयोग न करें। इंटर-थ्रेड संचार के लिए मानक पुस्तकालय <code>std::atomic<T></code> टेम्पलेट्स प्रदान करता है ।<ref>{{cite web |title=अस्थिर (सी ++)|url= https://msdn.microsoft.com/en-us/library/12a04hfd.aspx|work=Microsoft MSDN}}</ref> | ||
== '''जावा (Java) में''' == | == '''जावा (Java) में''' == | ||
[[जावा प्रोग्रामिंग भाषा]] में भी <code>volatile</code> | [[जावा प्रोग्रामिंग भाषा]] में भी <code>volatile</code> संकेतशब्द है परन्तु इसका उपयोग कुछ विभिन्न उद्देश्य के लिए किया जाता है। जब किसी क्षेत्र में लागू किया जाता है तो जावा क्वालीफायर <code>volatile</code> निम्नलिखित गारंटी प्रदान करता है: | ||
* जावा के सभी संस्करणों में सभी वोलेटाइल चरों के पढ़ने और लिखने पर एक वैश्विक क्रम है (वोलेटाइल पर यह वैश्विक क्रम बड़े तुल्यकालन क्रम पर आंशिक क्रम है (जो सभी तुल्यकालन क्रियाओं पर कुल क्रम है))। इसका तात्पर्य है कि प्रत्येक थ्रेड (कंप्यूटर विज्ञान) वोलेटाइल क्षेत्र तक पहुँचने से पहले कैच मान का उपयोग करने के स्थान पर (संभावित रूप से) जारी रखने से पहले अपने वर्तमान मूल्य को पढ़ेगा। (जबकि नियमित पढ़ने और लिखने के साथ वोलेटाइल पढ़ने और लिखने के सापेक्ष क्रम के | * जावा के सभी संस्करणों में सभी वोलेटाइल चरों के पढ़ने और लिखने पर एक वैश्विक क्रम है (वोलेटाइल पर यह वैश्विक क्रम बड़े तुल्यकालन क्रम पर आंशिक क्रम है (जो सभी तुल्यकालन क्रियाओं पर कुल क्रम है))। इसका तात्पर्य है कि प्रत्येक थ्रेड (कंप्यूटर विज्ञान) वोलेटाइल क्षेत्र तक पहुँचने से पहले कैच मान का उपयोग करने के स्थान पर (संभावित रूप से) जारी रखने से पहले अपने वर्तमान मूल्य को पढ़ेगा। (जबकि नियमित पढ़ने और लिखने के साथ वोलेटाइल पढ़ने और लिखने के सापेक्ष क्रम के विषय में कोई गारंटी नहीं है जिसका अर्थ है कि यह सामान्य रूप से उपयोगी थ्रेडिंग निर्माण नहीं है।) | ||
* जावा 5 या उसके बाद | * जावा 5 या उसके बाद के वोलेटाइल पढ़ते है और लिखते है तथा म्यूटेक्स को प्राप्त करने और जारी करने की तरह पूर्व-संबंध स्थापित करता है।<ref>Section 17.4.4: Synchronization Order | ||
{{cite web | {{cite web | ||
|title=The Java® Language Specification, Java SE 7 Edition | |title=The Java® Language Specification, Java SE 7 Edition | ||
Line 228: | Line 227: | ||
| archive-date=2021-05-09 | | archive-date=2021-05-09 | ||
| access-date=2021-05-09}}</ref> | | access-date=2021-05-09}}</ref> | ||
<code>volatile</code> का उपयोग करते हुए [[ ताला (कंप्यूटर विज्ञान) |लॉक (कंप्यूटर विज्ञान)]] से तीव्र हो सकता है परन्तु यह जावा 5 से | <code>volatile</code> का उपयोग करते हुए [[ ताला (कंप्यूटर विज्ञान) |लॉक (कंप्यूटर विज्ञान)]] से तीव्र हो सकता है परन्तु यह जावा 5 से पूर्व कुछ स्थितियों में काम नहीं करेगा।<ref>{{cite web | ||
|title=JSR 133 (Java Memory Model) FAQ | |title=JSR 133 (Java Memory Model) FAQ | ||
|url=https://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile | |url=https://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile | ||
Line 237: | Line 236: | ||
| archive-date=2021-05-09 | | archive-date=2021-05-09 | ||
|access-date=2019-11-05 | |access-date=2019-11-05 | ||
}}</ref> जावा 5 में वोलेटाइल स्थितियों की श्रेणी का विस्तार किया गया था; विशेष रूप से | }}</ref> जावा 5 में वोलेटाइल स्थितियों की श्रेणी का विस्तार किया गया था; विशेष रूप से [[डबल-चेक लॉकिंग]] अब सही प्रकार से काम करती है।<ref>{{cite web | ||
|title=Double-checked Locking (DCL) and how to fix it | |title=Double-checked Locking (DCL) and how to fix it | ||
|url=http://www.javamex.com/tutorials/double_checked_locking_fixing.shtml | |url=http://www.javamex.com/tutorials/double_checked_locking_fixing.shtml | ||
Line 245: | Line 244: | ||
=== C# में === | === C# में === | ||
C# (प्रोग्रामिंग भाषा) में <code>volatile</code> यह सुनिश्चित करता है कि फ़ील्ड तक पहुँचने वाला कोड कुछ थ्रेड-असुरक्षित अनुकूलन के अधीन नहीं है जो कि कंपाइलर, सीएलआर या हार्डवेयर द्वारा किया जा सकता है। जब | C# (प्रोग्रामिंग भाषा) में <code>volatile</code> यह सुनिश्चित करता है कि फ़ील्ड तक पहुँचने वाला कोड कुछ थ्रेड-असुरक्षित अनुकूलन के अधीन नहीं है जो कि कंपाइलर, सीएलआर या हार्डवेयर द्वारा किया जा सकता है। जब <code>volatile</code>क्षेत्र चिह्नित किया जाता है तब कंपाइलर को उसके चारों ओर मेमोरी बैरियर या फेंस उत्पन्न करने का निर्देश दिया जाता है जो निर्देश रीऑर्डरिंग या फ़ील्ड से बंधी कैचिंग को रोकता है। पढ़ते समय <code>volatile</code> फ़ील्ड, कंपाइलर धिग्रहण-फेंस उत्पन्न करता है जो अन्य थ्रेड्स सहित फ़ील्ड को फेंस के स्थानांतरित होने से पहले पढ़ने और लिखने से रोकता है। <code>volatile</code> क्षेत्र को लिखते समय संकलक रिलीज-फेंस उत्पन्न करता है; यह फेंस, फेंस के पश्चात अन्य को पढ़ने और लिखने से रोकता है।<ref name="Albahari">{{cite web |last1=Albahari |first1=Joseph |title=Part 4: Advanced Threading |url=http://www.albahari.com/threading/part4.aspx |website=Threading in C# |publisher=O'Reilly Media |access-date=9 December 2019 |archive-url=https://web.archive.org/web/20191212032535/http://www.albahari.com/threading/part4.aspx#_Nonblocking_Synchronization |archive-date=12 December 2019 |url-status=bot: unknown }}</ref> | ||
<code>volatile</code> | केवल निम्न प्रकारों को <code>volatile</code> चिह्नित किया जा सकता है: सभी संदर्भ प्रकार, <code>Single</code>, <code>Boolean</code>, <code>Byte</code>, <code>SByte</code>, <code>Int16</code>, <code>UInt16</code>, <code>Int32</code>, <code>UInt32</code>, <code>Char</code>, और सभी प्रगणित प्रकार एक अंतर्निहित प्रकार के साथ <code>Byte</code>, <code>SByte</code>, <code>Int16</code>, <code>UInt16</code>, <code>Int32</code>, या <code>UInt32</code>।<ref>{{cite book |last1=Richter |first1=Jeffrey |title=सीएलआर के माध्यम से सी#|url=https://archive.org/details/clrviac00rich_000 |url-access=limited |publisher=Microsoft Press |date=February 11, 2010 |pages=[https://archive.org/details/clrviac00rich_000/page/n200 183] |chapter=Chapter 7: Constants and Fields |isbn=978-0-7356-2704-8}}</ref> (इसमें वैल्यू स्ट्रक्चर्स के साथ ही मूल प्रकार <code>Double</code>, <code>Int64</code>, <code>UInt64</code> और <code>Decimal</code>सम्मिलित नहीं हैं)। | ||
<code>volatile</code> संकेतशब्द का उपयोग उन क्षेत्रों का समर्थन नहीं करता है जो [[क्लोजर (कंप्यूटर प्रोग्रामिंग)|जो संदर्भ द्वारा पारित (कंप्यूटर प्रोग्रामिंग)]] किए गए हैं या स्थानीय चर पर जिनका अधिकार है; ऐसी स्थितियों में <code>Thread.VolatileRead</code> और <code>Thread.VolatileWrite</code> उपयोग करना चाहिए।<ref name="Albahari"/> | |||
वास्तव में ये विधियाँ सामान्यतः C # कंपाइलर, JIT कंपाइलर या स्वयं CPU द्वारा किए गए कुछ अनुकूलन को अक्षम कर देती हैं। <code>Thread.VolatileRead</code>द्वारा प्रदान की गई गारंटी और <code>Thread.VolatileWrite</code> द्वारा प्रदान की गई गारंटी <code>volatile</code> | वास्तव में ये विधियाँ सामान्यतः C # कंपाइलर, JIT कंपाइलर या स्वयं CPU द्वारा किए गए कुछ अनुकूलन को अक्षम कर देती हैं। <code>Thread.VolatileRead</code>द्वारा प्रदान की गई गारंटी और <code>Thread.VolatileWrite</code> द्वारा प्रदान की गई गारंटी <code>volatile</code> संकेतशब्द का सुपरसेट है: आधा फेंस उत्पन्न करने के स्थान पर (अर्थात अधिग्रहण-फेंस केवल निर्देश पुनर्व्यवस्था और कैचिंग को रोकता है जो इससे पहले आता है), <code>VolatileRead</code> और <code>VolatileWrite</code> पूर्ण फेंस उत्पन्न करते हैं जो दोनों दिशाओं में उस क्षेत्र के निर्देश पुनर्क्रमण और कैचिंग को रोकता है।<ref name="Albahari"/> ये उपाय इस प्रकार कार्य करते हैं:<ref>{{cite book |last1=Richter |first1=Jeffrey |title=सीएलआर के माध्यम से सी#|url=https://archive.org/details/clrviac00rich_000 |url-access=limited |publisher=Microsoft Press |date=February 11, 2010 |pages=[https://archive.org/details/clrviac00rich_000/page/n814 797]–803 |chapter=Chapter 28: Primitive Thread Synchronization Constructs |isbn=978-0-7356-2704-8}}</ref> | ||
* <code>Thread.VolatileWrite</code> विधि फ़ील्ड में मान को कॉल के बिंदु पर लिखे जाने के लिए बाध्य करती है। इसके अतिरिक्त किसी भी पुराने प्रोग्राम-ऑर्डर लोड और स्टोर को कॉल करने से पहले <code>VolatileWrite</code>होना चाहिए और किसी भी बाद के प्रोग्राम-ऑर्डर लोड और स्टोर कॉल के बाद होने चाहिए। | * <code>Thread.VolatileWrite</code> विधि फ़ील्ड में मान को कॉल के बिंदु पर लिखे जाने के लिए बाध्य करती है। इसके अतिरिक्त किसी भी पुराने प्रोग्राम-ऑर्डर लोड और स्टोर को कॉल करने से पहले <code>VolatileWrite</code>होना चाहिए और किसी भी बाद के प्रोग्राम-ऑर्डर लोड और स्टोर कॉल के बाद होने चाहिए। | ||
* <code>Thread.VolatileRead</code> विधि कॉल के बिंदु पर फ़ील्ड में मान को पढ़ने के लिए बाध्य करती है। इसके अतिरिक्त किसी भी पुराने प्रोग्राम-ऑर्डर लोड और स्टोर को कॉल करने से पहले <code>VolatileRead</code> होना चाहिए और किसी भी बाद के प्रोग्राम-ऑर्डर लोड और स्टोर कॉल के बाद होने चाहिए। <code>Thread.VolatileRead</code> और <code>Thread.VolatileWrite</code> विधियाँ कॉल करके एक पूर्ण फेंस उत्पन्न करती हैं तथा <code>Thread.MemoryBarrier</code> विधि मेमोरी बैरियर का निर्माण करती है जो दोनों दिशाओं में काम करती है। ऊपर दिए गए पूर्ण फेंस का उपयोग करने के लिए प्रेरणाओं के अतिरिक्त एक संभावित समस्या <code>volatile</code> द्वारा उत्पन्न एक पूर्ण फेंस का उपयोग करके हल किया गया | * <code>Thread.VolatileRead</code> विधि कॉल के बिंदु पर फ़ील्ड में मान को पढ़ने के लिए बाध्य करती है। इसके अतिरिक्त किसी भी पुराने प्रोग्राम-ऑर्डर लोड और स्टोर को कॉल करने से पहले <code>VolatileRead</code> होना चाहिए और किसी भी बाद के प्रोग्राम-ऑर्डर लोड और स्टोर कॉल के बाद होने चाहिए। <code>Thread.VolatileRead</code> और <code>Thread.VolatileWrite</code> विधियाँ कॉल करके एक पूर्ण फेंस उत्पन्न करती हैं तथा <code>Thread.MemoryBarrier</code> विधि मेमोरी बैरियर का निर्माण करती है जो दोनों दिशाओं में काम करती है। ऊपर दिए गए पूर्ण फेंस का उपयोग करने के लिए प्रेरणाओं के अतिरिक्त एक संभावित समस्या <code>volatile</code> द्वारा उत्पन्न एक पूर्ण फेंस का उपयोग करके हल किया गया संकेतशब्द <code>Thread.MemoryBarrier</code> इस प्रकार है: आधा फेंस की असममित प्रकृति के कारण <code>volatile</code> पढ़ने के निर्देश के पश्चात लेखन निर्देश के साथ फ़ील्ड में अभी भी संकलक द्वारा निष्पादन आदेश स्वैप किया जा सकता है क्योंकि पूर्ण फेंस सममित हैं एवं <code>Thread.MemoryBarrier</code>उपयोग करते समय यह कोई समस्या नहीं है। <ref name="Albahari"/> | ||
== फोरट्रान में == | == फोरट्रान में == | ||
Line 262: | Line 261: | ||
write(*,*) i*i ! Loads the variable i twice from memory and multiplies those values | write(*,*) i*i ! Loads the variable i twice from memory and multiplies those values | ||
</syntaxhighlight> | </syntaxhighlight> | ||
वोलाटाइल की मेमोरी में सदैव "ड्रिलिंग डाउन" करने से फोरट्रान कंपाइलर द्वारा वोलाटाइल्स को पढ़ने या लिखने के क्रम को फिर से व्यवस्थित करने से रोक दिया जाता है। यह और इसके विपरीत इस थ्रेड में की गई अन्य थ्रेड क्रियाओं को यह दिखाई देता है।<ref>{{cite web | |||
|url=https://software.intel.com/en-us/forums/intel-moderncode-for-parallel-architectures/topic/279191 | |url=https://software.intel.com/en-us/forums/intel-moderncode-for-parallel-architectures/topic/279191 | ||
|title=फोरट्रान में अस्थिर और साझा सरणी|website=Intel.com}}</ref> | |title=फोरट्रान में अस्थिर और साझा सरणी|website=Intel.com}}</ref> | ||
Line 279: | Line 278: | ||
*[http://www.adaic.com/standards/05rm/html/RM-C-6.html Ada Reference Manual C.6: Shared Variable Control] | *[http://www.adaic.com/standards/05rm/html/RM-C-6.html Ada Reference Manual C.6: Shared Variable Control] | ||
*[https://web.archive.org/web/20160304053622/https://www.kernel.org/doc/Documentation/volatile-considered-harmful.txt Linux kernel: volatile-considered-harmful] | *[https://web.archive.org/web/20160304053622/https://www.kernel.org/doc/Documentation/volatile-considered-harmful.txt Linux kernel: volatile-considered-harmful] | ||
[[Category: | [[Category:CS1 maint]] | ||
[[Category:Created On 15/05/2023]] | [[Category:Created On 15/05/2023]] | ||
[[Category:Lua-based templates]] | |||
[[Category:Machine Translated Page]] | |||
[[Category:Pages with script errors]] | |||
[[Category:Templates Vigyan Ready]] | |||
[[Category:Templates that add a tracking category]] | |||
[[Category:Templates that generate short descriptions]] | |||
[[Category:Templates using TemplateData]] | |||
[[Category:चर (कंप्यूटर विज्ञान)]] | |||
[[Category:समरूपता नियंत्रण]] | |||
[[Category:सी (प्रोग्रामिंग भाषा)]] |
Latest revision as of 14:31, 15 June 2023
कंप्यूटर प्रोग्रामिंग में वोलेटाइल का अर्थ कोड के अनियंत्रित होने व समय के साथ उनके मूल्य के परिवर्तित होने की संभावना है। वोलेटाइल का कार्य कॉलिंग परिपाटियों के भीतर निहितार्थ है और यह चरों को कैसे संग्रहण, अभिगम और और कैच किया जाय इस पर भी प्रभाव डालता है।
C (प्रोग्रामिंग भाषा ), C++, C# और Java (जावा) प्रोग्रामिंग भाषा में वोलेटाइल संकेतशब्द (कंप्यूटर प्रोग्रामिंग) इंगित करता है कि वैल्यू (कंप्यूटर विज्ञान) भिन्न-भिन्न एक्सेस के मध्य परिवर्तित हो सकती है भले ही यह संशोधित प्रतीत न हो। यह संकेतशब्द अनुकूलन संकलक को बाद के रीड्स या राइट्स को इसके अनुकूल होने से रोकता है और इस प्रकार अशुद्ध रूप से पुराने मान का पुन: उपयोग करता है या राइट्स को छोड़ देता है। वोलेटाइल मान मुख्य रूप से हार्डवेयर एक्सेस (मेमोरी-मैप्ड I/O) में उत्पन्न होते हैं जहां मेमोरी से पढ़ने या लिखने का उपयोग परिधीय उपकरणों (संगणक के साथ जुड़े उपकरण) के साथ संवाद करने के लिए किया जाता है और जहां थ्रेड (कंप्यूटिंग) में अलग थ्रेड ने मान को संशोधित किया हो।
सामान्य संकेत शब्द होने के उपरांत volatile
का व्यवहार प्रोग्रामिंग भाषाओं के मध्य महत्वपूर्ण रूप से भिन्न है और त्रुटिपूर्ण समझा जाता है। C और C ++ में यह एक प्रकार का टाइप क्वालीफायर है जैसे const
और डेटा एक प्रकार की संपत्ति है। इसके अतिरिक्त C और C ++ में यह अधिकांश थ्रेडिंग परिदृश्यों में काम नहीं करता है और इसका उपयोग निराशाजनक होता है। Java और C # में यह चर (कंप्यूटर विज्ञान) की संपत्ति है और इंगित करता है कि वस्तु (कंप्यूटर विज्ञान) जिसके लिए चर बाध्य है उत्परिवर्तित हो सकता है तथा विशेष रूप से थ्रेडिंग के लिए अभीष्ट है। D (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा में थ्रेडिंग उपयोग के लिए एक अलग संकेतशब्द shared
होता है परन्तु कोई भी volatile
संकेतशब्द उपलब्ध नहीं है।
C और C ++ में
C और C ++ में volatile
संकेतशब्द का निम्नलिखित उद्देश्य था[1]
- मेमोरी-मैप्ड I/O उपकरणों तक पहुंच की अनुमति देना।
setjmp
औरlongjmp
के मध्य चरों के उपयोग की अनुमति देना।sig_atomic_t
सिग्नल हैंडलर में चरों के उपयोग की अनुमति देना।
जबकि C और C ++ दोनों के द्वारा अभिप्रेत C मानक यह व्यक्त करने में विफल रहते हैं कि volatile
सिमेंटिक्स लवल्यू को संदर्भित करता है, संदर्भित वस्तु को नहीं। संबंधित दोष रिपोर्ट DR 476 (C11 तक) अभी भी C17 (C मानक संशोधन) के साथ समीक्षाधीन है।[2]
volatile
चरों पर संचालन परमाणु संचालन नहीं होता हैं और न ही वे थ्रेडिंग के लिए उचित होते है जोकि पहले संबंध स्थापित करते हैं। यह प्रासंगिक मानकों (C, C++, POSIX, WIN32) में निर्दिष्ट है[1]और वोलेटाइल चर उपलब्ध कार्यान्वयन के विशाल बहुमत में थ्रेडसेफ नहीं हैं। इस प्रकार volatile
का उपयोग पोर्टेबल सिंक्रनाइज़ेशन तंत्र के रूप में संकेतशब्द को कई C/C ++ समूहों द्वारा हतोसात्हित किया जाता है।[3][4][5]
C में मेमोरी-मैप किए गए I/O का उदाहरण
इस उदाहरण में कोडfoo
में संग्रहीत मान 0
को सेट करता है तथा यह तब तक पोल (कंप्यूटर विज्ञान) आरम्भ करता है जब तक कि इसे परिवर्तित होने तक बार-बार 255
मूल्य नहीं मिलता:
static int foo;
void bar(void) {
foo = 0;
while (foo != 255)
;
}
ऑप्टिमाइज़िंग कंपाइलर इस बात का ध्यान रखता है कि कोई अन्य कोड संभवतः संग्रहीत मान foo
को परिवर्तित नहीं कर सकता है और मानता है कि यह 0
हर समय बराबर रहेगा। इसलिए कंपाइलर फ़ंक्शन बॉडी को इसके समान अनंत लूप से प्रतिस्थापित कर देता है:
void bar_optimized(void) {
foo = 0;
while (true)
;
}
जबकि foo
ऐसे स्थान का प्रतिनिधित्व कर सकता है जिसे किसी भी समय कंप्यूटर सिस्टम के अन्य तत्वों द्वारा परिवर्तित किया जा सकता है, जैसे कि CPU से जुड़े उपकरण का हार्डवेयर रजिस्टर। उपरोक्त कोड ऐसे परिवर्तन का कभी पता नहीं लगाएगा; volatile
संकेतशब्द के बिना कंपाइलर मानता है कि वर्तमान प्रोग्राम सिस्टम का एकमात्र भाग है जो मूल्य को परिवर्तित सकता है (जो अब तक की सबसे सामान्य स्थिति है)।
ऊपर के रूप में कोड को अनुकूलित करने से संकलक को रोकने के लिए volatile
संकेतशब्द प्रयोग किया जाता है:
static volatile int foo;
void bar (void) {
foo = 0;
while (foo != 255)
;
}
इस संशोधन के साथ लूप की स्थिति को अनुकूलित नहीं किया जाएगा और जब यह होता है तो सिस्टम परिवर्तन का पता लगाएगा।
सामान्य रूप से प्लेटफ़ॉर्म परस्मृति बाधा संचालन उपलब्ध होते हैं (जो C++11 में उजागर होते हैं) जिन्हें वोलेटाइल के अतिरिक्त प्राथमिकता दी जानी चाहिए क्योंकि वे कंपाइलर को उन्नत अनुकूलन करने की अनुमति देते हैं और इससे भी महत्वपूर्ण बात यह है कि वे बहु-थ्रेडेड परिदृश्यों में सही व्यवहार की गारंटी देते हैं; न तो C विनिर्देश (C 11 से पहले) और न ही C ++ विनिर्देश (C ++ 11 से पहले) बहु-थ्रेडेड मेमोरी मॉडल निर्दिष्ट करता है इसलिए वोलेटाइल ओएस/कंपाइलर/सीपीयू में निश्चित रूप से व्यवहार नहीं कर सकता है।[6]
C में अनुकूलन तुलना
निम्नलिखित C कार्यक्रम और साथ में असेंबलर भाषा अंश प्रदर्शित करते हैं कि कैसे volatile
संकेतशब्द कंपाइलर के आउटपुट को प्रभावित करता है। इस स्थिति में संकलक GNU संकलक संग्रह था।
असेंबली कोड का अवलोकन करते समय यह स्पष्ट रूप से दिखाई देता है कि वोलेटाइल वस्तुओं से उत्पन्न कोड अधिक क्रियात्मक है जिससे इसकी प्रकृति अधिक लंबी हो जाती है जिससे volatile
वस्तुओं की पूर्ति हो सकती है। volatile
संकेतशब्द संकलक को वोलेटाइल वस्तुओं से जुड़े कोड पर अनुकूलन करने से रोकता है इस प्रकार यह सुनिश्चित करता है कि प्रत्येक वोलेटाइल चर असाइनमेंट और रीड के पास एक समान मेमोरी एक्सेस हो। volatile
के बिना संकेतशब्द संकलक जानता है कि चर को प्रत्येक उपयोग पर मेमोरी से पुनः पढ़ने की आवश्यकता नहीं है क्योंकि किसी अन्य थ्रेड या प्रक्रिया से इसकी मेमोरी स्थिति पर कोई अधिकार नहीं होना चाहिए।
असेंबली तुलना | |
---|---|
Without volatile keyword |
With volatile keyword
|
# include <stdio.h>
int main() {
/* These variables will never be created on stack*/
int a = 10, b = 100, c = 0, d = 0;
/* "printf" will be called with arguments "%d" and
110 (the compiler computes the sum of a+b),
hence no overhead of performing addition at
run-time */
printf("%d", a + b);
/* This code will be removed via optimization, but
the impact of 'c' and 'd' becoming 100 can be
seen while calling "printf" */
a = b;
c = b;
d = b;
/* Compiler will generate code where printf is
called with arguments "%d" and 200 */
printf("%d", c + d);
return 0;
}
|
# include <stdio.h>
int main() {
volatile int a = 10, b = 100, c = 0, d = 0;
printf("%d", a + b);
a = b;
c = b;
d = b;
printf("%d", c + d);
return 0;
}
|
gcc -S -O3 -masm=intel noVolatileVar.c -o without.s | gcc -S -O3 -masm=intel VolatileVar.c -o with.s |
.file "noVolatileVar.c"
.intel_syntax noprefix
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "%d"
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB11:
.cfi_startproc
sub rsp, 8
.cfi_def_cfa_offset 16
mov esi, 110
mov edi, OFFSET FLAT:.LC0
xor eax, eax
call printf
mov esi, 200
mov edi, OFFSET FLAT:.LC0
xor eax, eax
call printf
xor eax, eax
add rsp, 8
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE11:
.size main, .-main
.ident "GCC: (GNU) 4.8.2"
.section .note.GNU-stack,"",@progbits
|
.file "VolatileVar.c"
.intel_syntax noprefix
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "%d"
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB11:
.cfi_startproc
sub rsp, 24
.cfi_def_cfa_offset 32
mov edi, OFFSET FLAT:.LC0
mov DWORD PTR [rsp], 10
mov DWORD PTR [rsp+4], 100
mov DWORD PTR [rsp+8], 0
mov DWORD PTR [rsp+12], 0
mov esi, DWORD PTR [rsp]
mov eax, DWORD PTR [rsp+4]
add esi, eax
xor eax, eax
call printf
mov eax, DWORD PTR [rsp+4]
mov edi, OFFSET FLAT:.LC0
mov DWORD PTR [rsp], eax
mov eax, DWORD PTR [rsp+4]
mov DWORD PTR [rsp+8], eax
mov eax, DWORD PTR [rsp+4]
mov DWORD PTR [rsp+12], eax
mov esi, DWORD PTR [rsp+8]
mov eax, DWORD PTR [rsp+12]
add esi, eax
xor eax, eax
call printf
xor eax, eax
add rsp, 24
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE11:
.size main, .-main
.ident "GCC: (GNU) 4.8.2"
.section .note.GNU-stack,"",@progbits
|
C ++ 11
C++11 ISO मानक के अनुसार वोलेटाइल संकेतशब्द मात्र हार्डवेयर एक्सेस के लिए उपयोग के लिए है; इंटर-थ्रेड संचार के लिए इसका उपयोग न करें। इंटर-थ्रेड संचार के लिए मानक पुस्तकालय std::atomic<T>
टेम्पलेट्स प्रदान करता है ।[7]
जावा (Java) में
जावा प्रोग्रामिंग भाषा में भी volatile
संकेतशब्द है परन्तु इसका उपयोग कुछ विभिन्न उद्देश्य के लिए किया जाता है। जब किसी क्षेत्र में लागू किया जाता है तो जावा क्वालीफायर volatile
निम्नलिखित गारंटी प्रदान करता है:
- जावा के सभी संस्करणों में सभी वोलेटाइल चरों के पढ़ने और लिखने पर एक वैश्विक क्रम है (वोलेटाइल पर यह वैश्विक क्रम बड़े तुल्यकालन क्रम पर आंशिक क्रम है (जो सभी तुल्यकालन क्रियाओं पर कुल क्रम है))। इसका तात्पर्य है कि प्रत्येक थ्रेड (कंप्यूटर विज्ञान) वोलेटाइल क्षेत्र तक पहुँचने से पहले कैच मान का उपयोग करने के स्थान पर (संभावित रूप से) जारी रखने से पहले अपने वर्तमान मूल्य को पढ़ेगा। (जबकि नियमित पढ़ने और लिखने के साथ वोलेटाइल पढ़ने और लिखने के सापेक्ष क्रम के विषय में कोई गारंटी नहीं है जिसका अर्थ है कि यह सामान्य रूप से उपयोगी थ्रेडिंग निर्माण नहीं है।)
- जावा 5 या उसके बाद के वोलेटाइल पढ़ते है और लिखते है तथा म्यूटेक्स को प्राप्त करने और जारी करने की तरह पूर्व-संबंध स्थापित करता है।[8][9]
volatile
का उपयोग करते हुए लॉक (कंप्यूटर विज्ञान) से तीव्र हो सकता है परन्तु यह जावा 5 से पूर्व कुछ स्थितियों में काम नहीं करेगा।[10] जावा 5 में वोलेटाइल स्थितियों की श्रेणी का विस्तार किया गया था; विशेष रूप से डबल-चेक लॉकिंग अब सही प्रकार से काम करती है।[11]
C# में
C# (प्रोग्रामिंग भाषा) में volatile
यह सुनिश्चित करता है कि फ़ील्ड तक पहुँचने वाला कोड कुछ थ्रेड-असुरक्षित अनुकूलन के अधीन नहीं है जो कि कंपाइलर, सीएलआर या हार्डवेयर द्वारा किया जा सकता है। जब volatile
क्षेत्र चिह्नित किया जाता है तब कंपाइलर को उसके चारों ओर मेमोरी बैरियर या फेंस उत्पन्न करने का निर्देश दिया जाता है जो निर्देश रीऑर्डरिंग या फ़ील्ड से बंधी कैचिंग को रोकता है। पढ़ते समय volatile
फ़ील्ड, कंपाइलर धिग्रहण-फेंस उत्पन्न करता है जो अन्य थ्रेड्स सहित फ़ील्ड को फेंस के स्थानांतरित होने से पहले पढ़ने और लिखने से रोकता है। volatile
क्षेत्र को लिखते समय संकलक रिलीज-फेंस उत्पन्न करता है; यह फेंस, फेंस के पश्चात अन्य को पढ़ने और लिखने से रोकता है।[12]
केवल निम्न प्रकारों को volatile
चिह्नित किया जा सकता है: सभी संदर्भ प्रकार, Single
, Boolean
, Byte
, SByte
, Int16
, UInt16
, Int32
, UInt32
, Char
, और सभी प्रगणित प्रकार एक अंतर्निहित प्रकार के साथ Byte
, SByte
, Int16
, UInt16
, Int32
, या UInt32
।[13] (इसमें वैल्यू स्ट्रक्चर्स के साथ ही मूल प्रकार Double
, Int64
, UInt64
और Decimal
सम्मिलित नहीं हैं)।
volatile
संकेतशब्द का उपयोग उन क्षेत्रों का समर्थन नहीं करता है जो जो संदर्भ द्वारा पारित (कंप्यूटर प्रोग्रामिंग) किए गए हैं या स्थानीय चर पर जिनका अधिकार है; ऐसी स्थितियों में Thread.VolatileRead
और Thread.VolatileWrite
उपयोग करना चाहिए।[12]
वास्तव में ये विधियाँ सामान्यतः C # कंपाइलर, JIT कंपाइलर या स्वयं CPU द्वारा किए गए कुछ अनुकूलन को अक्षम कर देती हैं। Thread.VolatileRead
द्वारा प्रदान की गई गारंटी और Thread.VolatileWrite
द्वारा प्रदान की गई गारंटी volatile
संकेतशब्द का सुपरसेट है: आधा फेंस उत्पन्न करने के स्थान पर (अर्थात अधिग्रहण-फेंस केवल निर्देश पुनर्व्यवस्था और कैचिंग को रोकता है जो इससे पहले आता है), VolatileRead
और VolatileWrite
पूर्ण फेंस उत्पन्न करते हैं जो दोनों दिशाओं में उस क्षेत्र के निर्देश पुनर्क्रमण और कैचिंग को रोकता है।[12] ये उपाय इस प्रकार कार्य करते हैं:[14]
Thread.VolatileWrite
विधि फ़ील्ड में मान को कॉल के बिंदु पर लिखे जाने के लिए बाध्य करती है। इसके अतिरिक्त किसी भी पुराने प्रोग्राम-ऑर्डर लोड और स्टोर को कॉल करने से पहलेVolatileWrite
होना चाहिए और किसी भी बाद के प्रोग्राम-ऑर्डर लोड और स्टोर कॉल के बाद होने चाहिए।Thread.VolatileRead
विधि कॉल के बिंदु पर फ़ील्ड में मान को पढ़ने के लिए बाध्य करती है। इसके अतिरिक्त किसी भी पुराने प्रोग्राम-ऑर्डर लोड और स्टोर को कॉल करने से पहलेVolatileRead
होना चाहिए और किसी भी बाद के प्रोग्राम-ऑर्डर लोड और स्टोर कॉल के बाद होने चाहिए।Thread.VolatileRead
औरThread.VolatileWrite
विधियाँ कॉल करके एक पूर्ण फेंस उत्पन्न करती हैं तथाThread.MemoryBarrier
विधि मेमोरी बैरियर का निर्माण करती है जो दोनों दिशाओं में काम करती है। ऊपर दिए गए पूर्ण फेंस का उपयोग करने के लिए प्रेरणाओं के अतिरिक्त एक संभावित समस्याvolatile
द्वारा उत्पन्न एक पूर्ण फेंस का उपयोग करके हल किया गया संकेतशब्दThread.MemoryBarrier
इस प्रकार है: आधा फेंस की असममित प्रकृति के कारणvolatile
पढ़ने के निर्देश के पश्चात लेखन निर्देश के साथ फ़ील्ड में अभी भी संकलक द्वारा निष्पादन आदेश स्वैप किया जा सकता है क्योंकि पूर्ण फेंस सममित हैं एवंThread.MemoryBarrier
उपयोग करते समय यह कोई समस्या नहीं है। [12]
फोरट्रान में
VOLATILE
फोरट्रान 2003 मानक का भाग है[15] जबकि पहले के संस्करण ने इसे विस्तार के रूप में समर्थित किया था। सभी volatile
चर बनाना किसी फ़ंक्शन में अलियासिंग (कंप्यूटिंग) संबंधित बग खोजने में भी उपयोगी है।
integer, volatile :: i ! When not defined volatile the following two lines of code are identical
write(*,*) i**2 ! Loads the variable i once from memory and multiplies that value times itself
write(*,*) i*i ! Loads the variable i twice from memory and multiplies those values
वोलाटाइल की मेमोरी में सदैव "ड्रिलिंग डाउन" करने से फोरट्रान कंपाइलर द्वारा वोलाटाइल्स को पढ़ने या लिखने के क्रम को फिर से व्यवस्थित करने से रोक दिया जाता है। यह और इसके विपरीत इस थ्रेड में की गई अन्य थ्रेड क्रियाओं को यह दिखाई देता है।[16]
वोलेटाइल का उपयोग अनुकूलन को कम करता है और रोक भी सकता है।[17]
संदर्भ
- ↑ 1.0 1.1 "सी++ मानक समिति पर प्रकाशन".
- ↑ Clarification Request Summary for C11. Version 1.13, October 2017.
- ↑ "विज़ुअल सी ++ में वाष्पशील कीवर्ड". Microsoft MSDN.
- ↑ "Linux Kernel Documentation – Why the "volatile" type class should not be used". kernel.org.
- ↑ Scott Meyers; Andrei Alexandrescu (2004). "सी++ और डबल-चेक्ड लॉकिंग के खतरे" (PDF). DDJ.
- ↑ Jeremy Andrews (2007). "Linux: Volatile Superstition". kerneltrap.org. Archived from the original on 2010-06-20. Retrieved Jan 9, 2011.
- ↑ "अस्थिर (सी ++)". Microsoft MSDN.
- ↑ Section 17.4.4: Synchronization Order "The Java® Language Specification, Java SE 7 Edition". Oracle Corporation. 2013. Retrieved 2013-05-12.
- ↑ "Java Concurrency: Understanding the 'Volatile' Keyword". dzone.com. 2021-03-08. Archived from the original on 2021-05-09. Retrieved 2021-05-09.
- ↑ Jeremy Manson; Brian Goetz (February 2004). "JSR 133 (Java Memory Model) FAQ". Archived from the original on 2021-05-09. Retrieved 2019-11-05.
- ↑ Neil Coffey. "Double-checked Locking (DCL) and how to fix it". Javamex. Retrieved 2009-09-19.
- ↑ 12.0 12.1 12.2 12.3 Albahari, Joseph. "Part 4: Advanced Threading". Threading in C#. O'Reilly Media. Archived from the original on 12 December 2019. Retrieved 9 December 2019.
{{cite web}}
: CS1 maint: bot: original URL status unknown (link) - ↑ Richter, Jeffrey (February 11, 2010). "Chapter 7: Constants and Fields". सीएलआर के माध्यम से सी#. Microsoft Press. pp. 183. ISBN 978-0-7356-2704-8.
- ↑ Richter, Jeffrey (February 11, 2010). "Chapter 28: Primitive Thread Synchronization Constructs". सीएलआर के माध्यम से सी#. Microsoft Press. pp. 797–803. ISBN 978-0-7356-2704-8.
- ↑ "वाष्पशील विशेषता और कथन". Cray. Archived from the original on 2018-01-23. Retrieved 2016-04-22.
- ↑ "फोरट्रान में अस्थिर और साझा सरणी". Intel.com.
- ↑ "परिवर्तनशील". Oracle.com.