2016-08-11 16 views
5

पुन: क्रम को रोकने:करता MS-विशिष्ट अस्थिर हार्डवेयर निर्देश <a href="https://msdn.microsoft.com/en-us/library/12a04hfd.aspx" rel="nofollow">documentation</a> से

माइक्रोसॉफ्ट विशिष्ट

जब/अस्थिर: एमएस संकलक विकल्प का इस्तेमाल किया द्वारा डिफ़ॉल्ट जब एआरएम के अलावा अन्य आर्किटेक्चर हैं है लक्षित- संकलक कोड में में अस्थिर वस्तुओं के संदर्भों के बीच क्रम को बनाए रखने के लिए अतिरिक्त कोड उत्पन्न करता है। अन्य वैश्विक ऑब्जेक्ट्स के संदर्भों को ऑर्डर करने के लिए अतिरिक्त। विशेष रूप से:

  • एक अस्थिर वस्तु (जिसे अस्थिर लेखन के रूप में भी जाना जाता है) को लिखना रिलीज अर्थशास्त्र है; यानी, वैश्विक या स्थैतिक ऑब्जेक्ट का संदर्भ
    जो निर्देश
    अनुक्रम में अस्थिर वस्तु को लिखने से पहले होता है संकलन
    बाइनरी में उस अस्थिर लेखन से पहले होता है।
  • एक अस्थिर वस्तु (जिसे अस्थिर पढ़ने के रूप में भी जाना जाता है) का एक पढ़ा गया है अर्थशास्त्र प्राप्त करें; यानी, एक वैश्विक या स्थैतिक वस्तु
    का संदर्भ जो निर्देश
    अनुक्रम में अस्थिर स्मृति के पढ़ने के बाद होता है, संकलित बाइनरी में उस अस्थिर पढ़ने के बाद होता है।

यह अस्थिर वस्तुओं को स्मृति ताले के लिए उपयोग करने में सक्षम बनाता है और को बहुप्रचारित अनुप्रयोगों में रिलीज़ करता है।

यह निश्चित रूप से गारंटी देता है कि volatile पुन: क्रम संकलन समय निर्देश करने से रोकता है संकलक (क्योंकि यह स्पष्ट रूप से कहा कि शिक्षा अनुक्रम में एक ही संकलित बाइनरी में हो जाएगा)।

लेकिन जैसा कि हम सभी जानते हैं, हार्डवेयर रीडरिंग जैसी चीज भी है (जैसे सीपीयू अपनी इच्छानुसार निर्देशों को पुन: व्यवस्थित करने में सक्षम है)। volatile इसे भी रोकता है? मुझे पता है कि सिंक्रनाइज़ेशन प्राइमेटिव्स (जैसे म्यूटेक्स) करते हैं, लेकिन एमएस-विशिष्ट volatile के बारे में क्या?

+1

"एआरएम के अलावा आर्किटेक्चर" द्वारा, एमएस का अर्थ x86 और x64 है। X86 और x64 पर, लोड को अन्य लोड के साथ पुन: व्यवस्थित नहीं किया जाता है। और दुकानों को अन्य दुकानों के साथ आदेश नहीं दिया जाता है। (गैर-अस्थायी स्टोर जैसे कुछ अपवादों के साथ) IOW, जब तक कि संकलक कुछ भी पुन: व्यवस्थित नहीं करता है, न ही प्रोसेसर होगा। ऐसा लगता है कि एमएस के लिए '/ अस्थिर '' std :: परमाणु' की कार्यक्षमता प्रदान करने का प्रयास कर रहा है जो सी ++ 11 तक अस्तित्व में नहीं था। – Mysticial

+0

इसके अलावा, वे कहते हैं "रिलीज सेमेन्टिक्स है", इसलिए दस्तावेज निश्चित रूप से * दावे * 'अस्थिर 'सीपीयू रीडरिंग को रोकता है। –

+0

@ मैस्टिसियल "ऐसा लगता है कि एमएस के लिए अस्थिर std :: परमाणु की कार्यक्षमता प्रदान करने की कोशिश कर रहा है" - नहीं, ऐसा नहीं है। उदाहरण के लिए, यह गारंटी नहीं है कि 'अस्थिर' चरों को पढ़ने और लिखने के संचालन परमाणु हैं। वास्तव में, वे हैं - क्योंकि x86 1-बाइट चर के लिए पढ़ने और लिखने के संचालन की परमाणुता की गारंटी देता है, लेकिन एमएसडीएन में 'volatile' – FrozenHeart

उत्तर

7

एमएस-विशिष्ट अस्थिर व्यवहार पर एमएसडीएन दस्तावेज़ VS2003 पर वापस जाते हैं। तो यह सी ++ 11 में std::atomic के अस्तित्व से पहले थोड़ी देर के लिए रहा है।

तो एमएस-विशिष्ट अस्थिर ऐसा तरीका प्रतीत होता है जिसने पुराने दिनों में अधिग्रहण/रिलीज किया है। लेकिन अब यह मूल रूप से अप्रचलित है और उन्होंने अंतर-थ्रेड संचार के लिए std::atomic और /volatile:iso के पक्ष में एमएस-अस्थिरता से दूर एक फुटनोट छोड़ा।


क्यों वे एआरएम को बाहर का सवाल है, माइक्रोसॉफ्ट अप एआरएम अपेक्षाकृत हाल ही में जब तक लेने नहीं किया। एआरएम के अलावा, वे x86, x64, और Itanium (जो मर चुका है) का समर्थन करते हैं।

x86 और x64 पर, अधिकांश लोड और स्टोर पहले ही अधिग्रहण/रिलीज सेमेन्टिक्स (गैर-अस्थायी स्टोर्स जैसे अपवादों के साथ) प्राप्त कर चुके हैं। इसलिए जब तक संकलक कुछ भी पुन: व्यवस्थित नहीं करता है, प्रोसेसर या तो * नहीं होगा और इसलिए अधिग्रहण/रिलीज अर्थशास्त्र को संरक्षित करेगा।/volatile:ms झंडा संकलक को कुछ भी पुन: व्यवस्थित नहीं करने के लिए कहता है ताकि x86 और x64 पर semantics प्राप्त/रिलीज़ किया जा सके।

के बाद से माइक्रोसॉफ्ट के एआरएम समर्थन अपेक्षाकृत नई है, और MS-विशिष्ट अस्थिर (/volatile:ms) std::atomic के पक्ष में पुरानी है, वे शायद के रूप में अच्छी तरह से एआरएम पर काम करने के लिए उन्हें अद्यतन करने के बजाय क्लासिक अस्थिर अर्थ विज्ञान का परित्याग करने के लिए (जो शायद होगा फैसला किया हार्डवेयर समर्थन की कमी के कारण हर जगह स्मृति बाधाओं को जोड़ना मतलब है)।

* प्रोसेसर अभी भी जो कुछ भी चाहता है वह कर देगा, लेकिन यह प्रोग्राम के अधिग्रहण/रिलीज सेमेन्टिक्स को संरक्षित करेगा क्योंकि इसकी आवश्यकता x86/x64 है। (एनटी-स्टोर्स या क्लफ्लश जैसे असाधारण मामलों को कम करें) मेमोरी ऑर्डरिंग का उल्लंघन किए बिना यह कैसे करता है यह एक अलग विषय है।

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