7

मैंने अस्थिर कीवर्ड के बारे में पढ़ा है, लेकिन मुझे नहीं पता कि मुझे किस स्थितियों में इसका उपयोग करना चाहिए।अस्थिरता का उपयोग कहां करें?

जब स्मृति (चर) अद्यतन हो रही है और प्रक्रिया उस से अवगत नहीं है?

किस मामले में ड्राइवर अस्थिर चर का उपयोग करते हैं?

+0

देखें: http://stackoverflow.com/questions/2535148/volatile-qualifier-and-compiler-reorderings (हालांकि दूसरे प्रश्न में सी ++ और सी टैग दोनों याद हैं कि सी ++ को यह कीवर्ड सी से मिला है। – dirkgently

+0

डॉ। डॉब्स - http://www.drdobbs.com/184403766;jsessionid=4HI2GRADWCN51QE1GHRSKHWATMY32JVN – pankajt

+0

देखें [ सी में अस्थिर क्यों आवश्यक है? ] (http://stackoverflow.com/questions/246127/why-is-volatile-needed-in-c)। –

उत्तर

12

मेरी दुनिया में सबसे आम मामला यह है कि जब आप प्रोग्रामिंग माइक्रोक्रोनरोलर प्रोग्रामिंग कर रहे हैं जो स्मृति-मैप किए गए I/O का उपयोग करते हैं। बाहरी डिजिटल इनपुट के कारण एक रजिस्टर में मूल्य बदल सकता है, लेकिन यदि आप volatile के रूप में एक चर घोषित नहीं करते हैं, तो संकलक पूरी तरह से कोड को अनुकूलित कर सकता है और आप सोचेंगे कि कुछ भी क्यों काम नहीं करता है।

मैट ने सुझाव दिया कि मैं "ऑप्टिमाइज़ आउट" प्राप्त करने वाले कोड के बारे में बयान पर सजा देता हूं। मेमोरी मैप किए गए I/O को पॉइंटर्स के माध्यम से कोड में एक्सेस किया जाता है। जब आप किसी बटन की स्थिति जांचना चाहते हैं, तो आप बटन के लिए बिटमैस्क के साथ आमतौर पर बिटवाई और रजिस्टर का मान लेंगे। यदि आप अस्थिर निर्दिष्ट नहीं करते हैं, तो संकलक कहेंगे, "अरे, आपका कोड वास्तव में उस सूचक के मान को कभी भी नहीं बदलता है, इसलिए मैं उस कथन को हटाने जा रहा हूं जहां आपने थोड़ा सा किया है, क्योंकि यह मान हमेशा होता है वही!"।

उम्मीद है कि यह मेरे कथन को थोड़ा सा साफ़ कर देगा। सुझाव के लिए धन्यवाद, मैट।

+1

आपको "ऑप्टिमाइज़ आउट" द्वारा इसका मतलब क्या होना चाहिए, जबकि यह हमारे कुछ लोगों से परिचित है, इसका मतलब यह है कि यह हर किसी के लिए नहीं हो सकता है। –

-1

अस्थिर चर वेरिएबल्स हैं जिन्हें किसी भी बिंदु पर बदला जा सकता है, प्रोग्राम के बारे में जानने के बिना।

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

+0

उन्होंने एक परिभाषा के लिए नहीं पूछा, उन्होंने उपयोग के लिए कहा। – RPM1984

+0

अलेक्जेंडर सही है। वह एक निशान के लायक नहीं है। इसके ऊपर उदाहरण हैं जो इसे चित्रित करते हैं। दैनिक उपयोग में एक उदाहरण यह है कि यदि आप चर के लिए सूचक का उपयोग करते हैं। संकलक यह नहीं बता सकता कि कुछ ने सूचक के माध्यम से चर बदल दिया है। – Eddy

3

के लिए उपयोगी हो सकता है, लिनक्स कर्नेल के भीतर कोडिंग के लिए कुछ विशिष्ट सलाह क्रम में संभवतः है।

सामान्य रूप से, आपको अपने लिनक्स कर्नेल कोड में volatile लिखने की आवश्यकता नहीं है। उन मामलों में जहां volatile की आवश्यकता हो सकती है, इसका उपयोग कोर कर्नेल फ़ंक्शंस में लपेटा गया है जिसे आपको इसके बजाय कॉल करना चाहिए। उदाहरण के लिए, यदि आप स्मृति-मैप की मैं क्या कर रहे हैं/ओ, तो आप ioremap()writel() का उपयोग कर, होना चाहिए, readl() आदि

-1

मेरी जानकारी से, सी में volatile कीवर्ड इस्तेमाल किया जाना चाहिए जहां समवर्ती अनसिंक्रनाइज़्ड कार्यों पर प्रदर्शन कर रहे हैं एक से अधिक स्रोत (प्रक्रिया) से एक चर। यदि चर volatile घोषित किया गया है, तो सभी प्रक्रियाएं माइक्रोप्रोसेसर के कैश में चर की प्रतिलिपि बनाने और वहां से पहुंचने के विरोध में हमेशा इसके मेमोरी लोकेशन से चर का उपयोग करती रहेंगी।
ध्यान दें कि यह विशेष रूप से उस विशेष चर के लिए प्रदर्शन कम करेगा। इन-मेमोरी चर के लिए एक्सेस टाइम मिलीसेकंड के क्रम में है, जबकि 1'स्तर या 2'स्तर के कैश वेरिएबल्स के लिए यह कहीं नैनोसेकंड के दसवें स्थान पर है, इसलिए केवल तभी उपयोग करें जब अन्य सभी विकल्पों पर विचार किया गया हो।

+0

क्या एक से अधिक स्रोत (प्रक्रिया) से एक चर पर समवर्ती असीमित परिचालन करना संभव है? – Pointer

+0

@ योगेश: हाँ। सबसे सरल उदाहरण एक वेरिएबल है जो एक सिग्नल हैंडलर से लिखा गया है और एक प्रोग्राम के मुख्य लूप में पढ़ा जाता है (उदाहरण के लिए, "साफ करें और समाप्त करें" ध्वज)। अन्य में साझा स्मृति के विभिन्न रूप शामिल हैं, जैसे साझा मेमोरी-मैप की गई फ़ाइल। –

2

अन्य रूपों के अलावा अन्य रूपों के अलावा, अस्थिर कीवर्ड आम तौर पर अनुकूलन करने वाले संकलक फ़ॉर्म को रोकने के लिए होता है। कुछ मेमोरी मैप किए गए रजिस्टरों में जहां टीएच रजिस्टरों का मूल्य एक आरटीसी घड़ी मूल्य की तरह chinagin पर रहता है अस्थिर कुंजी शब्द का उपयोग किया जाता है। इस उदाहरण पर एक नज़र डालें:

RTC_CLOCK _time; 
TIME _currentTime = _time ; 
while(_currentTime - _time >= 100) 
{ 

//Do something 

} 

//rest of the code 

हम अस्थिर कीवर्ड समय से पहले इस कोड _currentTime के रूप में इस तरह होगा संलग्न नहीं है, तो - _time = 0 और संकलक यह नीचे है, जबकि पाश पर विचार नहीं करेंगे .:

RTC_CLOCK _time; 
TIME _currentTime = _time ; 
//rest of the code 

इसे रोकने के लिए हमें समय के साथ अस्थिर कीवर्ड का उपयोग करना होगा।

+0

उत्कृष्ट ठोस, उत्तर को समझने में आसान। और इस बारे में झूठी बकवास से भरा नहीं है कि यह कैसे समेकन में मदद करता है। –

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