तो मैं स्मृति मॉडल है कि आगामी C++ 0x मानक का हिस्सा है के बारे में पढ़ रहा था। हालांकि, मैं संकलक को करने की अनुमति देने के लिए कुछ प्रतिबंधों के बारे में थोड़ा उलझन में हूं, खासकर सट्टा भार और दुकानों के बारे में।C++ 0x स्मृति मॉडल और सट्टा लोड/स्टोर
शुरू में, प्रासंगिक सामान में से कुछ:
Hans Boehm's pages about threads and the memory model in C++0x
Boehm, "Threads Cannot be Implemented as a Library"
Boehm and Adve, "Foundations of the C++ Concurrency Memory Model"
Boehm, "Concurrency memory model compiler consequences", N2338
अब, मूल विचार अनिवार्य रूप से "डेटा-रेस-नि: शुल्क कार्यक्रम के लिए अनुक्रमिक संगति" है, जो प्रोग्रामिंग की आसानी और संकलक और हार्डवेयर के अवसरों का अनुकूलन करने के लिए अनुमति देता है के बीच एक सभ्य समझौता हो रहा है है। एक डाटा दौड़ स्मृति स्थान के लिए उनमें से कम से कम एक भंडार होने के लिये करता है, तो अलग धागे से एक ही स्मृति स्थान के लिए दो पहुंच आदेश दिया नहीं कर रहे हैं, परिभाषित किया गया है, और उनमें से कम से कम एक एक तुल्यकालन कार्रवाई नहीं है। यह संकेत मिलता है कि साझा किए गए डेटा के लिए सभी पढ़ने/लिखने के लिए एक्सेस इस तरह के परमाणु चर पर mutexes या संचालन (अच्छी तरह से, यह विशेषज्ञों केवल के लिए आदेश देने आराम स्मृति परमाणु चर पर संचालित करने के लिए संभव है, लेकिन के रूप में कुछ तुल्यकालन तंत्र के माध्यम से होना चाहिए, डिफ़ॉल्ट अनुक्रमिक स्थिरता के लिए प्रदान करता है)।
इस के प्रकाश में, मैं साधारण साझा चर पर नकली या सट्टा लोड/स्टोर के बारे में प्रतिबंध के बारे में संदेह में हूँ। उदाहरण के लिए, N2338 में हम उदाहरण है
switch (y) {
case 0: x = 17; w = 1; break;
case 1: x = 17; w = 3; break;
case 2: w = 9; break;
case 3: x = 17; w = 1; break;
case 4: x = 17; w = 3; break;
case 5: x = 17; w = 9; break;
default: x = 17; w = 42; break;
}
y == 2 एक्स के लिए एक नकली लिखने जो एक समस्या हो सकती है वहाँ है अगर के बाद से जो संकलक
tmp = x; x = 17;
switch (y) {
case 0: w = 1; break;
case 1: w = 3; break;
case 2: x = tmp; w = 9; break;
case 3: w = 1; break;
case 4: w = 3; break;
case 5: w = 9; break;
default: w = 42; break;
}
में रूपांतरित करने के लिए अनुमति नहीं है यदि एक और धागा समवर्ती रूप से एक्स अद्यतन कर रहे थे। लेकिन, यह एक समस्या क्यों है? यह एक डेटा रेस है, जिसे वैसे भी प्रतिबंधित है; इस मामले में, कंपाइलर सिर्फ दो बार x लिखकर इसे और भी खराब बनाता है, लेकिन डेटा लिखने के लिए भी एक ही लेखन पर्याप्त होगा, नहीं? अर्थात। एक उचित सी ++ 0x प्रोग्राम को एक्स तक पहुंच सिंक्रनाइज़ करने की आवश्यकता होगी, इस मामले में अब डेटा रेस नहीं होगी, और नकली स्टोर कोई समस्या नहीं होगी?
मैं भी इसी तरह N2197 में उदाहरण 3.1.3 और अन्य उदाहरण में से कुछ लेकर संदेह में हूँ, लेकिन शायद ऊपर जारी करने के लिए एक स्पष्टीकरण वह भी समझा जाएगा।
संपादित करें: उत्तर:
कारण है कि सट्टा भंडार एक समस्या हैं कि ऊपर स्विच बयान के उदाहरण में, प्रोग्रामर सशर्त ताला ही अगर y एक्स की रक्षा के अधिग्रहण के लिए निर्वाचित हो सकता है = 2! इसलिए सट्टा स्टोर एक डेटा रेस पेश कर सकता है जो मूल कोड में नहीं था, और इस प्रकार परिवर्तन को प्रतिबंधित किया गया है। एक ही तर्क N2197 में उदाहरण 3.1.3 पर भी लागू होता है।
शायद http://groups.google.com/group/comp.std.c++ –