c++ सी++ 11 ने एक मानक स्मृति मॉडल पेश किया। इसका क्या मतलब है? और यह सी++ प्रोग्रामिंग को कैसे प्रभावित करेगा?




multithreading c++11 (5)

सी ++ 11 ने एक मानक स्मृति मॉडल पेश किया, लेकिन इसका क्या अर्थ है? और यह सी ++ प्रोग्रामिंग को कैसे प्रभावित करेगा?

यह आलेख ( गेविन क्लार्क द्वारा हर्ब सटर उद्धृत करते हैं) कहते हैं कि,

मेमोरी मॉडल का मतलब है कि सी ++ कोड में अब एक मानक लाइब्रेरी है, इस पर ध्यान दिए बिना कि किसने कंपाइलर बनाया है और यह किस प्लेटफॉर्म पर चल रहा है। यह नियंत्रित करने का एक मानक तरीका है कि विभिन्न धागे प्रोसेसर की स्मृति से कैसे बात करते हैं।

"जब आप मानक में अलग-अलग कोरों में विभाजित [कोड] के बारे में बात कर रहे हैं, तो हम मेमोरी मॉडल के बारे में बात कर रहे हैं। हम निम्नलिखित मानकों को तोड़ने के बिना इसे अनुकूलित करने जा रहे हैं, लोग कोड में शामिल होने जा रहे हैं।"

खैर, मैं इस और इसी तरह के पैराग्राफ ऑनलाइन उपलब्ध कर सकता हूं (जैसा कि मेरे जन्म से मेरा अपना मेमोरी मॉडल है: पी) और दूसरों द्वारा पूछे गए प्रश्नों के उत्तर के रूप में भी पोस्ट कर सकते हैं, लेकिन ईमानदार होने के लिए, मैं इसे बिल्कुल समझ नहीं पा रहा हूं ।

तो, जो मैं मूल रूप से जानना चाहता हूं वह है, सी ++ प्रोग्रामर बहु-थ्रेडेड अनुप्रयोगों को पहले भी विकसित करते थे, तो यह कैसे मायने रखता है कि यह पॉज़िक्स थ्रेड, या विंडोज थ्रेड, या सी ++ 11 धागे हैं? क्या लाभ हैं? मैं निम्न स्तर के विवरण को समझना चाहता हूं।

मुझे यह भी महसूस होता है कि सी ++ 11 मेमोरी मॉडल किसी भी तरह से सी ++ 11 बहु-थ्रेडिंग समर्थन से संबंधित है, क्योंकि मैं अक्सर इन दोनों को एक साथ देखता हूं। यदि यह है, तो वास्तव में कैसे? उन्हें क्यों संबंधित होना चाहिए?

जैसा कि मुझे नहीं पता कि बहु-थ्रेडिंग के आंतरिक कैसे काम करते हैं, और सामान्य रूप से स्मृति मॉडल का अर्थ क्या है, कृपया इन अवधारणाओं को समझने में मेरी सहायता करें। :-)


मैं केवल समानता दूंगा जिसके साथ मैं स्मृति स्थिरता मॉडल (या स्मृति मॉडल, संक्षिप्त के लिए) समझता हूं। यह लेस्ली लैमपोर्ट के मौलिक पेपर "टाइम, क्लॉक्स, एंड द ऑर्डरिंग ऑफ इवेंट्स इन डिस्ट्रिब्यूटेड सिस्टम" से प्रेरित है। समानता उपयुक्त है और इसका मौलिक महत्व है, लेकिन कई लोगों के लिए अधिक हो सकता है। हालांकि, मुझे उम्मीद है कि यह एक मानसिक छवि (एक चित्रमय प्रतिनिधित्व) प्रदान करता है जो स्मृति स्थिरता मॉडल के बारे में तर्क की सुविधा प्रदान करता है।

आइए स्पेस-टाइम आरेख में सभी मेमोरी स्थानों के इतिहास देखें, जिसमें क्षैतिज अक्ष पता स्थान का प्रतिनिधित्व करती है (यानी, प्रत्येक स्मृति स्थान उस धुरी पर एक बिंदु द्वारा दर्शाया जाता है) और लंबवत धुरी समय का प्रतिनिधित्व करता है (हम उसे देखेंगे, सामान्य रूप से, समय की सार्वभौमिक धारणा नहीं है)। इसलिए, प्रत्येक मेमोरी लोकेशन द्वारा रखे गए मूल्यों का इतिहास उस स्मृति पते पर लंबवत कॉलम द्वारा दर्शाया जाता है। प्रत्येक मान परिवर्तन उस स्थान पर एक नया मान लिखने वाले थ्रेडों में से एक के कारण होता है। एक स्मृति छवि द्वारा, हम एक विशेष थ्रेड द्वारा किसी विशेष समय पर देखे जाने वाले सभी मेमोरी स्थानों के मूल्यों का कुल / संयोजन का अर्थ लेंगे।

"मेमोरी संगति और कैश समेकन पर एक प्राइमर" से उद्धरण

अंतर्ज्ञानी (और सबसे प्रतिबंधित) मेमोरी मॉडल अनुक्रमिक स्थिरता (एससी) है जिसमें एक बहुप्रचारित निष्पादन प्रत्येक घटक धागे के अनुक्रमिक निष्पादन के अंतःक्रिया की तरह दिखना चाहिए, जैसे कि धागे एक-कोर प्रोसेसर पर समय-मल्टीप्लेक्स किए गए थे।

वह वैश्विक स्मृति आदेश प्रोग्राम के एक रन से दूसरे में भिन्न हो सकता है और पहले से ज्ञात नहीं हो सकता है। अनुसूचित जाति की विशेषता विशेषता एक-दूसरे के विमानों (यानी, स्मृति छवियों) का प्रतिनिधित्व करने वाले पता-अंतरिक्ष-समय आरेख में क्षैतिज स्लाइस का सेट है। किसी दिए गए विमान पर, इसके सभी कार्यक्रम (या स्मृति मान) एक साथ होते हैं। पूर्ण समय की धारणा है, जिसमें सभी धागे इस बात पर सहमत हैं कि स्मृति मान एक साथ हैं। अनुसूचित जाति में, हर समय तत्काल, सभी धागे द्वारा साझा की गई केवल एक स्मृति छवि होती है। यही है, समय के हर पल में, सभी प्रोसेसर स्मृति छवि (यानी, स्मृति की कुल सामग्री) पर सहमत होते हैं। न केवल यह दर्शाता है कि सभी धागे सभी स्मृति स्थानों के लिए मानों के समान अनुक्रम को देखते हैं, लेकिन यह भी कि सभी प्रोसेसर सभी चर के मानों के समान संयोजनों का पालन ​​करते हैं। यह वही है जैसा कि सभी मेमोरी ऑपरेशंस (सभी मेमोरी स्थानों पर) सभी धागे द्वारा उसी क्रम में मनाया जाता है।

आराम से स्मृति मॉडल में, प्रत्येक धागा एड्रेस-स्पेस-टाइम को अपने तरीके से टुकड़ा कर देगा, केवल एक ही प्रतिबंध यह है कि प्रत्येक धागे के स्लाइस एक-दूसरे को पार नहीं करेंगे क्योंकि सभी धागे प्रत्येक व्यक्तिगत स्मृति स्थान के इतिहास पर सहमत होना चाहिए (बेशक , विभिन्न धागे के स्लाइस एक दूसरे को पार कर सकते हैं, और करेंगे)। इसे टुकड़ा करने का कोई सार्वभौमिक तरीका नहीं है (पता-स्थान-समय का कोई विशेषाधिकार प्राप्त पत्तियां नहीं)। स्लाइस प्लानर (या रैखिक) होने की ज़रूरत नहीं है। उन्हें घुमाया जा सकता है और यही वह धागा है जो किसी अन्य थ्रेड द्वारा लिखे गए क्रम से लिखे गए मानों को पढ़ सकता है। विभिन्न मेमोरी स्थानों के इतिहास किसी विशेष थ्रेड द्वारा देखे जाने पर मनमाने ढंग से एक दूसरे के सापेक्ष स्लाइड (या बढ़ाया जा सकता है) । प्रत्येक धागे की एक अलग भावना होगी जिसमें घटनाएं (या, समतुल्य रूप से, स्मृति मान) एक साथ हैं। घटनाओं (या स्मृति मान) का सेट जो एक थ्रेड के साथ-साथ एक दूसरे के साथ नहीं होते हैं। इस प्रकार, एक आराम से स्मृति मॉडल में, सभी थ्रेड अभी भी एक ही इतिहास (यानी, मूल्यों का क्रम) प्रत्येक स्मृति स्थान के लिए देखते हैं। लेकिन वे विभिन्न स्मृति छवियों (यानी, सभी स्मृति स्थानों के मूल्यों के संयोजन) देख सकते हैं। यहां तक ​​कि अगर दो अलग-अलग स्मृति स्थान अनुक्रम में एक ही थ्रेड द्वारा लिखे गए हैं, तो दो नए लिखित मानों को अन्य धागे द्वारा अलग-अलग क्रम में देखा जा सकता है।

[विकिपीडिया से चित्र]

आइंस्टीन के सापेक्षता के विशेष सिद्धांत से परिचित पाठकों को पता चलेगा कि मैं क्या कह रहा हूं। स्मृति मॉडल में Minkowski के शब्दों का अनुवाद क्षेत्र: पता स्थान और समय पता-अंतरिक्ष-समय की छाया हैं। इस मामले में, प्रत्येक पर्यवेक्षक (यानी, धागा) घटनाओं की छाया (यानी, मेमोरी स्टोर्स / लोड) को अपनी खुद की विश्व-रेखा (यानी, उसका समय धुरी) और एक साथ अपने स्वयं के विमान (उसके पता-स्थान धुरी) पर छाया देगा। । सी ++ 11 मेमोरी मॉडल में थ्रेड पर्यवेक्षकों से मेल खाते हैं जो विशेष सापेक्षता में एक दूसरे के सापेक्ष चल रहे हैं। अनुक्रमिक स्थिरता गैलीलियन अंतरिक्ष-समय से मेल खाती है (यानी, सभी पर्यवेक्षकों घटनाओं के एक पूर्ण क्रम और एक साथ वैश्विक भावना पर सहमत हैं)।

मेमोरी मॉडल और विशेष सापेक्षता के बीच समानता इस तथ्य से उत्पन्न होती है कि दोनों घटनाओं के आंशिक रूप से क्रमबद्ध सेट को परिभाषित करते हैं, जिन्हें अक्सर एक कारण सेट कहा जाता है। कुछ घटनाएं (यानी, मेमोरी स्टोर्स) अन्य घटनाओं को प्रभावित कर सकती हैं (लेकिन इससे प्रभावित नहीं)। एक सी ++ 11 धागा (या भौतिकी में पर्यवेक्षक) घटनाओं की एक श्रृंखला (यानी, पूरी तरह से आदेशित सेट) से अधिक नहीं है (उदाहरण के लिए, मेमोरी लोड और संभवतः अलग-अलग पते पर स्टोर)।

सापेक्षता में, कुछ आदेश आंशिक रूप से आदेशित घटनाओं की प्रतीत होता है अराजक तस्वीर के लिए बहाल किया जाता है, क्योंकि एकमात्र अस्थायी आदेश जो सभी पर्यवेक्षकों पर सहमत होते हैं, वे "समयबद्ध" घटनाओं के बीच क्रमबद्ध होते हैं (यानी, उन घटनाओं जो कि किसी भी कण द्वारा धीरे-धीरे कनेक्ट करने योग्य होते हैं वैक्यूम में प्रकाश की गति से)। केवल समयबद्ध संबंधित घटनाओं को आविष्कारित आदेश दिया जाता है। भौतिकी में समय, क्रेग कॉलेंडर

सी ++ 11 मेमोरी मॉडल में, इन स्थानीय कारक संबंधों को स्थापित करने के लिए एक समान तंत्र (अधिग्रहण-रिलीज स्थिरता मॉडल) का उपयोग किया जाता है।

स्मृति स्थिरता की परिभाषा और अनुसूचित जाति को त्यागने के लिए एक प्रेरणा प्रदान करने के लिए, मैं "स्मृति प्राथमिकता और कैश समन्वय पर एक प्राइमर" से उद्धरण दूंगा

साझा स्मृति मशीन के लिए, स्मृति स्थिरता मॉडल इसकी स्मृति प्रणाली के स्थापत्य रूप से दृश्यमान व्यवहार को परिभाषित करता है। एक एकल प्रोसेसर कोर विभाजन के लिए शुद्धता मानदंड " एक सही परिणाम " और " कई गलत विकल्प " के बीच व्यवहार करता है । ऐसा इसलिए है क्योंकि प्रोसेसर के आर्किटेक्चर के लिए जरूरी है कि थ्रेड का निष्पादन किसी दिए गए इनपुट स्थिति को एक अच्छी तरह से परिभाषित आउटपुट स्थिति में बदल देता है, यहां तक ​​कि आउट-ऑफ-ऑर्डर कोर पर भी। साझा स्मृति स्थिरता मॉडल, हालांकि, कई धागे के लोड और स्टोर को लेकर चिंतित हैं और आमतौर पर कई (अधिक) गलत लोगों को अस्वीकार करते समय कई सही निष्पादन की अनुमति देते हैं। कई सही निष्पादन की संभावना आईएसए के कारण कई धागे को एक साथ निष्पादित करने की अनुमति देती है, अक्सर विभिन्न धागे से निर्देशों के कई संभावित कानूनी अंतःक्रियाओं के साथ।

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

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

चूंकि कैश समेकन और स्मृति स्थिरता कभी-कभी भ्रमित होती है, इसलिए यह उद्धरण भी निर्देशक है:

स्थिरता के विपरीत, कैश समेकन न तो सॉफ्टवेयर के लिए दृश्यमान है और न ही आवश्यक है। समेकन एक साझा-स्मृति प्रणाली के कैश को एकल-कोर सिस्टम में कैश के रूप में कार्यात्मक रूप से अदृश्य बनाने की कोशिश करता है। सही समन्वय सुनिश्चित करता है कि एक प्रोग्रामर यह निर्धारित नहीं कर सकता कि लोड और स्टोर्स के परिणामों का विश्लेषण करके सिस्टम को कैश कैसा है या नहीं। ऐसा इसलिए है क्योंकि सही समन्वय सुनिश्चित करता है कि कैश नए या अलग कार्यात्मक व्यवहार को सक्षम नहीं करते हैं (प्रोग्रामर समय-समय पर जानकारी का उपयोग कर संभावित कैश संरचना का अनुमान लगाने में सक्षम हो सकते हैं)। कैश समेकन प्रोटोकॉल का मुख्य उद्देश्य प्रत्येक स्मृति स्थान के लिए सिंगल-लेखक-एकाधिक-पाठकों (एसडब्ल्यूएमआर) इनवेरिएंट को बनाए रखना है। समेकन और स्थिरता के बीच एक महत्वपूर्ण अंतर यह है कि प्रति-स्मृति स्थान के आधार पर समेकन निर्दिष्ट किया गया है, जबकि सभी स्मृति स्थानों के संबंध में स्थिरता निर्दिष्ट है।

हमारी मानसिक तस्वीर के साथ जारी रखते हुए, एसडब्ल्यूएमआर आविष्कार भौतिक आवश्यकता से मेल खाता है कि किसी एक स्थान पर स्थित एक कण पर होता है लेकिन किसी भी स्थान के पर्यवेक्षकों की असीमित संख्या हो सकती है।


यदि आप अपने सभी डेटा की सुरक्षा के लिए म्यूटेक्स का उपयोग करते हैं, तो आपको वास्तव में चिंता करने की आवश्यकता नहीं है। म्यूटेक्स ने हमेशा पर्याप्त आदेश और दृश्यता गारंटी प्रदान की है।

अब, अगर आपने परमाणु, या लॉक-फ्री एल्गोरिदम का उपयोग किया है, तो आपको मेमोरी मॉडल के बारे में सोचना होगा। मेमोरी मॉडल ठीक से वर्णन करता है जब परमाणु आदेश और दृश्यता गारंटी प्रदान करते हैं, और हाथ से कोडित गारंटी के लिए पोर्टेबल बाड़ प्रदान करते हैं।

पहले, परमाणु संकलक इंट्रिनिक्स, या कुछ उच्च स्तरीय पुस्तकालय का उपयोग करके किया जाएगा। बाड़ सीपीयू-विशिष्ट निर्देशों (स्मृति बाधाओं) का उपयोग करके किया गया होगा।


यह अब एक बहु-वर्षीय प्रश्न है, लेकिन बहुत लोकप्रिय होने के कारण, सी ++ 11 मेमोरी मॉडल के बारे में सीखने के लिए एक शानदार संसाधन का उल्लेख करना उचित है। मुझे यह एक और पूर्ण जवाब देने के लिए अपनी बातचीत को संक्षेप में कोई बात नहीं दिखती है, लेकिन यह वह व्यक्ति है जिसने वास्तव में मानक लिखा है, मुझे लगता है कि यह बात देखने के लायक है।

हर्ब सटर में चैनल 9 साइट - भाग 1 और भाग 2 पर उपलब्ध "परमाणु <> हथियार" नामक सी ++ 11 मेमोरी मॉडल के बारे में तीन घंटे की लंबी बात है। बात बहुत तकनीकी है, और निम्नलिखित विषयों को शामिल करती है:

  1. अनुकूलन, दौड़, और मेमोरी मॉडल
  2. ऑर्डरिंग - क्या: प्राप्त करें और रिलीज़ करें
  3. ऑर्डरिंग - कैसे: म्यूटेक्स, परमाणु, और / या बाड़
  4. कंपाइलर्स और हार्डवेयर पर अन्य प्रतिबंध
  5. कोड जनरल और प्रदर्शन: x86 / x64, आईए 64, पावर, एआरएम
  6. आराम से परमाणु

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


इसका मतलब है कि मानक अब बहु-थ्रेडिंग को परिभाषित करता है, और यह परिभाषित करता है कि एकाधिक धागे के संदर्भ में क्या होता है। बेशक, लोग अलग-अलग कार्यान्वयन का इस्तेमाल करते थे, लेकिन यह पूछने की तरह है कि हमारे पास std::string क्यों होनी चाहिए जब हम सभी घर-लुढ़काए string क्लास का उपयोग कर सकें।

जब आप POSIX थ्रेड या विंडोज थ्रेड के बारे में बात कर रहे हैं, तो यह एक भ्रम का थोड़ा सा है क्योंकि वास्तव में आप x86 थ्रेड के बारे में बात कर रहे हैं, क्योंकि यह एक हार्डवेयर फ़ंक्शन एक साथ चलने के लिए है। सी ++ 0 एक्स मेमोरी मॉडल गारंटी देता है, भले ही आप x86, या एआरएम, या MIPS , या कुछ भी जिसके साथ आप आ सकते हैं।


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

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

दिलचस्प बात यह है कि सी ++ के लिए माइक्रोसॉफ्ट कंपाइलर्स ने अस्थिरता के लिए अर्थशास्त्र प्राप्त / रिलीज़ किया है जो सी ++ में स्मृति मॉडल की कमी से निपटने के लिए सी ++ एक्सटेंशन है http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.80).aspx । हालांकि, यह देखते हुए कि विंडोज केवल x86 / x64 पर चलता है, यह इतना नहीं कह रहा है (इंटेल और एएमडी मेमोरी मॉडल एक भाषा में अधिग्रहण / रिलीज सेमेन्टिक्स को लागू करने के लिए आसान और कुशल बनाते हैं)।





memory-model