अन्य प्रश्नों और उनके जवाबों के एक समूह को देखने के बाद , मुझे यह धारणा मिली कि सी में "वाष्पशील" कीवर्ड का व्यापक रूप से कोई समझौता नहीं है।
यहां तक कि मानक अपने आप में सभी के लिए पर्याप्त रूप से स्पष्ट नहीं लगता है कि इसका क्या मतलब है ।
अन्य समस्याओं में:
- यह आपके हार्डवेयर के आधार पर और आपके कंपाइलर के आधार पर अलग-अलग गारंटी प्रदान करता है।
- यह इतना एक उन्नत प्रोसेसर है कि अपने स्वयं के रन-टाइम अनुकूलन करता है पर, संकलक अनुकूलन नहीं बल्कि हार्डवेयर अनुकूलन को प्रभावित करता है, तो यह और भी स्पष्ट नहीं है कि क्या संकलक कर सकते हैं आप को रोकने के लिए चाहते हैं जो कुछ भी अनुकूलन को रोकने के। (कुछ कंपाइलर कुछ सिस्टम पर कुछ हार्डवेयर ऑप्टिमाइज़ेशन को रोकने के लिए निर्देश उत्पन्न करते हैं, लेकिन यह किसी भी तरह से मानकीकृत नहीं होता है।)
समस्या को सारांशित करने के लिए, यह प्रकट होता है (बहुत पढ़ने के बाद) कि "वाष्पशील" कुछ गारंटी देता है: मान केवल एक रजिस्टर से / के लिए नहीं बल्कि कम से कम कोर के एल 1 कैश में पढ़ा / लिखा जाएगा, उसी क्रम में कोड में रीड / राइट दिखाई देते हैं। लेकिन यह बेकार लगता है, क्योंकि एक रजिस्टर में / से पढ़ना / लिखना पहले से ही एक ही धागे के भीतर पर्याप्त है, जबकि L1 कैश के साथ समन्वय अन्य थ्रेड्स के साथ समन्वय के बारे में आगे कुछ भी गारंटी नहीं देता है। मैं कल्पना नहीं कर सकता कि यह कभी भी महत्वपूर्ण हो सकता है कि सिर्फ एल 1 कैश के साथ सिंक करें।
USE 1
वाष्पशील का एकमात्र व्यापक रूप से सहमत-उपयोग पुराने या एम्बेडेड सिस्टम के लिए प्रतीत होता है, जहाँ कुछ मेमोरी लोकेशन I / O फ़ंक्शंस में हार्डवेयर-मैप किए जाते हैं, जैसे मेमोरी में थोड़ा सा नियंत्रण (सीधे, हार्डवेयर में) एक लाइट या स्मृति में एक बिट जो आपको बताता है कि कीबोर्ड कुंजी नीचे है या नहीं (क्योंकि यह हार्डवेयर द्वारा सीधे कुंजी से जुड़ा है)।
ऐसा लगता है कि "उपयोग 1" पोर्टेबल कोड में नहीं होता है जिनके लक्ष्य में मल्टी-कोर सिस्टम शामिल हैं।
USE 2
"उपयोग 1" से बहुत अलग नहीं है एक मेमोरी हैंडलर है जिसे किसी भी समय एक बाधा हैंडलर द्वारा पढ़ा जा सकता है या लिखा जा सकता है (जो एक कुंजी से प्रकाश या स्टोर की जानकारी को नियंत्रित कर सकता है)। लेकिन पहले से ही हमारे पास यह समस्या है कि सिस्टम के आधार पर, इंटरप्ट हैंडलर अपनी मेमोरी कैश के साथ एक अलग कोर पर चल सकता है , और "अस्थिर" सभी सिस्टम पर कैश सुसंगतता की गारंटी नहीं देता है।
तो "उपयोग 2" लगता है कि "अस्थिर" क्या दे सकता है।
USE 3
केवल अन्य निर्विवाद उपयोग जो मैं देख रहा हूं, विभिन्न चर के माध्यम से एक्सेस के गलत अनुकूलन को रोकने के लिए एक ही मेमोरी की ओर इशारा करते हैं जो संकलक को एहसास नहीं होता है। लेकिन यह शायद केवल निर्विवाद है क्योंकि लोग इसके बारे में बात नहीं कर रहे हैं - मैंने केवल इसका एक उल्लेख देखा। और मुझे लगा कि सी मानक पहले से ही मान्यता प्राप्त है कि "अलग" पॉइंटर्स (जैसे एक फ़ंक्शन के लिए अलग-अलग args) एक ही आइटम या आस-पास के आइटम को इंगित कर सकते हैं, और पहले से ही निर्दिष्ट है कि कंपाइलर को कोड का उत्पादन करना चाहिए जो ऐसे मामलों में भी काम करता है। हालाँकि, मैं इस विषय को नवीनतम (500 पेज!) मानक में जल्दी नहीं खोज सका।
तो "3 का उपयोग करें" शायद सभी में मौजूद नहीं है ?
इसलिए मेरा सवाल:
क्या "वाष्पशील" मल्टी-कोर सिस्टम के लिए पोर्टेबल सी कोड में कुछ भी गारंटी देता है?
EDIT - अपडेट
नवीनतम मानक ब्राउज़ करने के बाद , ऐसा लग रहा है कि उत्तर कम से कम बहुत सीमित हां है:
1. मानक बार-बार विशिष्ट प्रकार के "वाष्पशील sig_atomic_t" के लिए विशेष उपचार निर्दिष्ट करता है। हालाँकि मानक यह भी कहता है कि एक बहु-थ्रेडेड प्रोग्राम में सिग्नल फ़ंक्शन के उपयोग से अपरिभाषित व्यवहार होता है। इसलिए यह उपयोग मामला एकल-थ्रेडेड प्रोग्राम और इसके सिग्नल हैंडलर के बीच संचार तक सीमित लगता है।
2. मानक भी setjmp / longjmp के संबंध में "अस्थिर" के लिए एक स्पष्ट अर्थ निर्दिष्ट करता है। (उदाहरण कोड जहां यह मायने रखता है अन्य प्रश्नों और उत्तरों में दिया गया है ।)
इसलिए अधिक सटीक प्रश्न बन जाता है:
क्या "वाष्पशील" मल्टी-कोर सिस्टम के लिए पोर्टेबल सी कोड में कुछ भी गारंटी देता है, इसके अलावा (1) एक एकल-थ्रेडेड प्रोग्राम को अपने सिग्नल हैंडलर से जानकारी प्राप्त करने की अनुमति देता है, या (2) सेटजम्प की अनुमति देता है सेजम्प और लॉन्गजम्प के बीच संशोधित चर को देखने के लिए कोड?
यह अभी भी एक हाँ / नहीं सवाल है।
यदि "हाँ", यह बहुत अच्छा होगा यदि आप बग-मुक्त पोर्टेबल कोड का एक उदाहरण दिखा सकते हैं जो "अस्थिर" होने पर छोटी गाड़ी बन जाता है। यदि "नहीं" है, तो मुझे लगता है कि मल्टी-कोर लक्ष्य के लिए इन दो बहुत विशिष्ट मामलों के बाहर एक संकलक "अस्थिर" को अनदेखा करने के लिए स्वतंत्र है।
volatile
विशेष रूप से है, जो मुझे विश्वास है कि आवश्यक है।
volatile
कार्यक्रम को सूचित करने की आवश्यकता होगी कि यह अतुल्यकालिक रूप से बदल सकता है।