2012-05-10 13 views
21

सी ++ 11 मानक में, अनुभाग 1.10/5 उल्लेख, लेकिन औपचारिक रूप से acquire operation, release operation, और consume operation शर्तों को परिभाषित नहीं करता है। यह कुछ स्मृति स्मृति, परमाणु संचालन, और स्मृति बाड़ के कार्यों का वर्णन करने के लिए इन शर्तों का उपयोग करने के लिए धारा 2 9 में चला जाता है। उदाहरण के लिए, 29.3/1 "आदेश और संगति" पर कहा गया है:सी ++ 11 मानक औपचारिक रूप से अधिग्रहण, रिहाई को परिभाषित, और संचालन का उपभोग करता है?

memory_order_release, memory_order_acq_rel, और memory_order_seq_cst: एक दुकान संचालन एक रिहाई आपरेशन प्रभावित स्मृति पर [जोर जोड़ा] करता है स्थान।

भाषा के इस प्रकार के खंड 29 के दौरान दोहराया है, लेकिन यह मुझे थोड़ा परेशान करती है कि memory_order enumerations के लिए सभी अर्थ आपरेशन प्रकार है कि खुद को मानक द्वारा औपचारिक रूप हो रहे हैं नहीं है पर आधारित होते हैं, फिर भी कुछ होना आवश्यक है आमतौर पर परिभाषाओं के रूप में प्रभावी होने के लिए इसका अर्थ है।

एक अलग तरह रखो, अगर मैंने कहा, बार और foo अस्पष्ट हैं, क्योंकि इनमें से अवधि औपचारिक रूप से परिभाषित किया गया है की ठोस अर्थ "एक बार एक फ़्लिप foo है।" केवल उनके रिश्तेदार स्वरूप परिभाषित किए जाते हैं।

क्या सी ++ 11 मानक, या कुछ अन्य सी ++ 11 मानक समिति दस्तावेज़ औपचारिक रूप से परिभाषित करता है कि वास्तव में acquire operation, release operation इत्यादि क्या है, या ये आमतौर पर समझने वाले शब्द हैं? यदि उत्तरार्द्ध, क्या कोई अच्छा संदर्भ है जिसे इन परिचालनों के अर्थ के लिए उद्योग मानक माना जाता है? मैं विशेष रूप से, क्योंकि हार्डवेयर स्मृति स्थिरता मॉडल समान बनाया नहीं कर रहे हैं पूछना है, और इसलिए मैं वहाँ होना चाहिए कुछ सामान्य रूप से सहमति-के संदर्भ में है कि उन को लागू करने compilers, आदि ठीक से देशी विधानसभा आदेश में इन आपरेशनों के शब्दों का अनुवाद करने देता लगाना कर रहा हूँ।

+1

मैं ओपी से सहमत हूं। चाहे मानक तार्किक रूप से समझने वाला एक प्रश्न है, लेकिन किसी भी दर पर मानक इस विशेष बिंदु पर असामान्य रूप से भ्रमित है। – thb

+0

[जेफ Preshing के ब्लॉग रिहाई/अधिग्रहण के बारे में पोस्ट] (http://preshing.com/20120913/acquire-and-release-semantics/) के संबंध में आवश्यक आदेश देने के मामले में उन्हें परिभाषित करता है पहले/बाद में लोड/स्टोर, एक में जिस तरह से सी ++ 11 अर्थशास्त्र के साथ संगत है। मुझे एहसास नहीं हुआ था कि सी ++ 11 ने औपचारिक रूप से इस तरह के शब्दों को परिभाषित नहीं किया था। –

उत्तर

6

वहाँ एक अनौपचारिक संक्षेप नोटों में से एक में दी गई परिभाषा है:

A बलों पर एक रिलीज कार्रवाई करते अन्य स्मृति स्थल पर पूर्व दुष्प्रभाव अन्य धागे कि बाद में एक उपभोग करते हैं या एक प्राप्त करने के लिए दिखाई देने लगते हैं करने के लिए A पर ऑपरेशन।

कि इसके अलावा, अधिग्रहण और रिहाई के संचालन के व्यवहार को पूरी तरह से 1.10 में, विशेष रूप से वे कैसे योगदान के लिए होता-से पहले रिश्तों में परिभाषित किया गया है। व्यवहार से अलग कोई परिभाषा बेकार है।

+0

मुझे लगता है कि यह "अनौपचारिक सारांश" है जो मुझे परेशान करता है। उदाहरण के लिए, यदि आप किसी दिए गए प्लेटफ़ॉर्म के लिए हार्डवेयर निर्देशों पर रिलीज़ ऑपरेशन को मैप करने का प्रयास करते हैं, तो आपको यह जानना होगा कि क्या सैद्धांतिक रूप से अनुमति है और अनुमति नहीं है, क्योंकि हार्डवेयर कुछ विशिष्ट "रिलीज़" ऑपरेशन प्रदान नहीं कर सकता है। चूंकि एक-से-एक पत्राचार नहीं है, इसलिए अधिक औपचारिक अर्थ सटीक अनुवादों में सहायता कर सकता है। ऐसा कहा जा रहा है, मैं धारा 1.10 को फिर से पढ़ूंगा और देख सकता हूं कि क्या आप जिस व्यवहार का वर्णन कर रहे हैं उसके बीच पुल का और अर्थ नहीं समझ सकते हैं, और ऑपरेशन के वास्तविक उपयोग स्वयं को संदर्भित करते हैं। – Jason

+1

@ जेसन: मानक व्यवहार पर केंद्रित है। यह अलगाव में शर्तों को परिभाषित करने की कोशिश नहीं करता है। –

+0

@ जेसन, यह ध्यान दिया जाना चाहिए कि इंटेल तकनीकी दस्तावेज़ों में भी स्मृति आदेश गारंटी को व्यवहारिक आदेश गारंटी के रूप में कुछ हद तक वर्णित किया गया है। यही है, स्मृति आदेश एक व्यवहार है जो निर्देशों की एक श्रृंखला द्वारा नियंत्रित होता है। सी ++ गारंटीकृत आदेश कैसे प्राप्त किए जाते हैं, उसी प्लेटफ़ॉर्म के लिए कंपाइलर से कंपाइलर से भिन्न हो सकते हैं, और निश्चित रूप से विभिन्न हार्डवेयर के लिए होंगे। –

3

मुझे मानक के माध्यम से त्वरित रूप से देखने के बाद अधिग्रहण/रिलीज सेमेन्टिक्स की कोई औपचारिक परिभाषा नहीं दिखाई देती है, इसलिए मेरा अनुमान है कि उन्हें आमतौर पर शब्दों को समझ लिया जाता है।

वे सब कुछ, सब के बाद परिभाषित नहीं कर सकते हैं।

यह एक निश्चित संदर्भ नहीं है, लेकिन Raymond Chen has blogged about acquire/release semantics है। उनकी पोस्ट में a link to Microsoft's definition of acquire and release semantics शामिल है, जिन्हें आप भी उपयोगी पा सकते हैं।

+0

आपको बेस आईएसओ दस्तावेज़ों पर भी विचार करना चाहिए, उदा। सी और यूनिकोड (10646)। – MSalters

0

मैं भी प्राप्त/रिलीज अर्थ विज्ञान काफी अपने आप पर निश्चित होना करने के लिए ले लो; हालांकि वे प्रोग्रामिंग शर्तों के बजाय ऐतिहासिक रूप से अधिक हार्डवेयर विशिष्ट शब्द हैं।

लेकिन, मुझे लगता है कि धारा 1.10 पैरा 5 और 6 सभी अधिग्रहण/रिलीज सेमेन्टिक्स परिभाषाओं से मेल खाते हैं जो मैंने अन्य भाषा मानकों के साथ-साथ सीपीयू परिभाषाओं में पढ़ा है।

भले ही, सी ++ 11 के प्रमुख बिंदुओं में से एक समवर्ती और बहु ​​थ्रेडेड कोड का समर्थन करने के लिए एक आधुनिक मेमोरी मॉडल को परिभाषित करना था। मैं इसे कठिन विश्वास करने के लिए वे नहीं मिला यह सही :)

3

वास्तव में इन ऑपरेशन अनुभाग 1.10/5-12 में परिभाषित कर रहे हैं लगता है।

release/acquire जोड़ी से संबंधित है संबंध से पहले होता है; जबकि release/consumeपर निर्भरता संबंध से पहले निर्भरता-आदेश दिया गया।

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