दिलचस्प पोस्ट
एंड्रॉइड में संपत्ति और कच्चे संसाधनों का कारण 100% की ऊंचाई फ़ायरफ़ॉक्स पर काम करती है लेकिन आईई में नहीं एंड्रॉइड ब्लूटूथ RFCOMM कनेक्शन को .connect () के तुरंत बाद मरने से कैसे रोकें? विधियों के स्थिर आयात के लिए एक अच्छा उपयोग क्या है? क्या मॉलोक धागा सुरक्षित है? जावा में कक्षाएं उतारने? वैकल्पिक पैरामीटर के साथ ओवरलोड किए गए विधियों पर विरोधाभासी स्विफ्ट में दो (या अधिक) विकल्प एनोटेशन पिंस फिट करने के लिए MKMapView ज़ूम करना? jQuery दिनांक स्वरूपण लिनक्स के लिए वर्चुअल सीरियल पोर्ट आप पायथन में एकाधिक मान कैसे वापस करते हैं? छवि-नक्शे और छवियों को गतिशील रूप से रीसाइज़ करना नॉकआउट में अद्यतन नहीं करने योग्य अवलोकन के मूल्य निर्धारित करना क्यों कहते हैं कि HTTP एक स्टेटलेस प्रोटोकॉल है?

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

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

यह लेख ( गेविन क्लार्क द्वारा जो हर्ब सटर उद्धरण) का कहना है कि,

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

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

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

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

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

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

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

सबसे पहले, आपको एक भाषा वकील की तरह सोचना सीखना होगा

सी ++ विनिर्देश किसी विशेष कंपाइलर, ऑपरेटिंग सिस्टम या सीपीयू के संदर्भ में नहीं है। यह एक अमूर्त मशीन का संदर्भ देता है जो वास्तविक सिस्टम का सामान्यीकरण है। भाषा वकील दुनिया में, प्रोग्रामर का काम अमूर्त मशीन के लिए कोड लिखना है; कंपाइलर का काम एक ठोस मशीन पर उस कोड को वास्तविक बनाना है। कल्पना के लिए कठोर ढंग से कोडिंग करके, आप निश्चित हो सकते हैं कि आपका कोड किसी भी सिस्टम पर किसी भी संगत C ++ कंपाइलर के साथ बिना किसी संशोधन के बिना संकलन करेगा और चलाएगा, चाहे वह आज या 50 साल से हो।

सी ++ 98 / सी +0 03 विनिर्देश में अमूर्त मशीन मूल रूप से सिंगल-थ्रेडेड है। इसलिए बहु-थ्रेडेड C ++ कोड लिखना संभव नहीं है जो कि "स्पेयर के संदर्भ में" पूरी तरह से पोर्टेबल "है। कल्पना स्मृति भार और भंडार या जिस क्रम में लोड और भंडार हो सकता है, उस पर निर्भरता के बारे में कुछ भी नहीं कहता है, म्यूटक्स जैसी चीजों को कभी भी मत नहीं मानें।

बेशक, आप विशेष रूप से ठोस प्रणालियों – जैसे pthreads या Windows के लिए बहु-थ्रेडेड कोड लिख सकते हैं लेकिन C ++ 98 / C + 03 03 के लिए बहु-थ्रेडेड कोड लिखने का कोई मानक तरीका नहीं है।

सी ++ 11 में अमूर्त मशीन डिजाइन द्वारा बहु-थ्रेडेड है। इसमें एक अच्छी तरह से परिभाषित स्मृति मॉडल भी है ; यही है, यह कहता है कि मेमोरी तक पहुंचने के समय संकलक क्या कर सकता है और नहीं कर सकता है

निम्न उदाहरण पर विचार करें, जहां वैश्विक चर की एक जोड़ी को दो सूत्रों द्वारा समवर्ती रूप से एक्सेस किया जाता है:

Global int x, y; Thread 1 Thread 2 x = 17; cout << y << " "; y = 37; cout << x << endl; 

थ्रेड 2 आउटपुट क्या हो सकता है?

सी ++ 98 / सी +0 03 के तहत, यह भी अनिर्धारित व्यवहार नहीं है; सवाल ही व्यर्थ है क्योंकि मानक "थ्रेड" नामक कुछ भी नहीं विचार करता है।

सी +11 के तहत, परिणाम अपरिभाषित व्यवहार है, क्योंकि भार और भंडार सामान्य रूप से परमाणु होने की आवश्यकता नहीं है। जो बहुत सुधार की तरह प्रतीत नहीं हो सकता है … और स्वयं के द्वारा, ऐसा नहीं है।

लेकिन सी ++ 11 के साथ, आप यह लिख सकते हैं:

  Global atomic<int> x, y; Thread 1 Thread 2 x.store(17); cout << y.load() << " "; y.store(37); cout << x.load() << endl; 

अब चीजें ज्यादा दिलचस्प हो जाती हैं सबसे पहले, यहां व्यवहार परिभाषित किया गया है । थ्रेड 2 अब 0 0 (यदि यह थ्रेड 1 से पहले चलाता है), 37 17 (यदि यह थ्रेड 1 के बाद चलाता है), या 0 17 (यदि यह थ्रेड 1 के बाद चलाता है, लेकिन एक्स से पहले यह तय होता है) को प्रिंट कर सकता है।

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

अब, आधुनिक सीपीयू पर, अनुक्रमिक स्थिरता सुनिश्चित करना महंगा हो सकता है विशेष रूप से, कंपाइलर यहां हर पहुंच के बीच पूर्ण विकसित स्मृति बाधाओं को फेंकने की संभावना है। लेकिन अगर आपके एल्गोरिथम आउट-ऑफ-ऑर्डर भार और स्टोर को बर्दाश्त कर सकता है; यानी, अगर इसे परमाणुता की आवश्यकता होती है लेकिन आदेश नहीं दे रहा है; यानी, अगर यह इस प्रोग्राम से आउटपुट के रूप में 37 0 को सहन कर सकता है, तो आप इसे लिख सकते हैं:

  Global atomic<int> x, y; Thread 1 Thread 2 x.store(17,memory_order_relaxed); cout << y.load(memory_order_relaxed) << " "; y.store(37,memory_order_relaxed); cout << x.load(memory_order_relaxed) << endl; 

अधिक आधुनिक सीपीयू, यह पिछले उदाहरण की तुलना में तेज़ होना ज़रूरी है।

अंत में, यदि आपको विशेष लोड और स्टोर को क्रम में रखना है, तो आप लिख सकते हैं:

  Global atomic<int> x, y; Thread 1 Thread 2 x.store(17,memory_order_release); cout << y.load(memory_order_acquire) << " "; y.store(37,memory_order_release); cout << x.load(memory_order_acquire) << endl; 

यह हमें आदेशित भार और भंडार पर ले जाता है – इसलिए 37 0 अब संभव उत्पादन नहीं है – लेकिन यह न्यूनतम ओवरहेड के साथ ऐसा करता है (इस तुच्छ उदाहरण में, परिणाम पूर्ण रूप से समानांतर अनुक्रमिक स्थिरता के समान है; एक बड़े कार्यक्रम में, यह नहीं होगा।)

बेशक, यदि आप देखना चाहते हैं कि केवल आउटपुट 0 0 या 37 17 , तो आप केवल मूल कोड के आसपास एक म्यूट एक्स लपेट कर सकते हैं। लेकिन अगर आपने इसे पढ़ा है, तो मुझे यकीन है कि आप पहले से ही जानते हैं कि यह कैसे काम करता है, और यह जवाब पहले से ही लंबे समय से अधिक है :-)।

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

हालांकि फ्रैंक होने के बावजूद, जब तक आप एक विशेषज्ञ नहीं हैं और कुछ गंभीर निम्न-स्तरीय कोड पर काम कर रहे हैं, तो आपको संभवतः म्यूटक्स और हालत चर के लिए छड़ी करना चाहिए। यही मेरा इरादा है

इस सामान पर अधिक जानकारी के लिए, यह ब्लॉग पोस्ट देखें

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

क्योंकि कैश जुटना और स्मृति स्थिरता कभी-कभी उलझन में होती है, यह भी इस उद्धरण के लिए शिक्षाप्रद है:

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

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

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

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

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

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

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

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

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

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

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

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

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

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