2012-09-09 15 views
17

स्टोर रिलीज ऑपरेशन हैं और लोड दोनों के लिए संचालन अधिग्रहण कर रहे हैं। मुझे पता है कि memory_order_seq_cst सभी परिचालनों के लिए अतिरिक्त कुल ऑर्डर देने का मतलब है, लेकिन मैं एक उदाहरण बनाने में असफल रहा हूं, जहां यह मामला नहीं है यदि सभी memory_order_seq_cstmemory_order_acq_rel द्वारा प्रतिस्थापित किए गए हैं।memory_order_seq_cst और memory_order_acq_rel कैसे भिन्न होते हैं?

मैं कुछ याद आती है, या अंतर सिर्फ एक प्रलेखन प्रभाव है, यानि कि एक memory_order_seq_cst का उपयोग करना चाहिए अगर एक जब आराम मॉडल को बाधित करने के लिए एक अधिक आराम से मॉडल के साथ खेलते हैं और memory_order_acq_rel का उपयोग नहीं करने का इरादा रखते हैं?

उत्तर

18

http://en.cppreference.com/w/cpp/atomic/memory_order नीचे एक अच्छा उदाहरण है जो केवल memory_order_seq_cst के साथ काम करता है। अनिवार्य रूप से memory_order_acq_rel परमाणु चर के सापेक्ष पढ़ने और लिखने के आदेश प्रदान करता है, जबकि memory_order_seq_cst विश्व स्तर पर पढ़ने और लिखने का आदेश प्रदान करता है। यही है, अनुक्रमिक रूप से लगातार संचालन सभी धागे में एक ही क्रम में दिखाई दे रहे हैं।

उदाहरण इस करने पर निर्भर करता: z पर

bool x= false; 
bool y= false; 
int z= 0; 

a() { x= true; } 
b() { y= true; } 
c() { while (!x); if (y) z++; } 
d() { while (!y); if (x) z++; } 

// kick off a, b, c, d, join all threads 
assert(z!=0); 

संचालन, दो परमाणु चर, नहीं एक एक करके पहरा रहे हैं ताकि आप अधिग्रहण रिलीज अर्थ विज्ञान का उपयोग नहीं कर लागू करने के लिए है कि z हमेशा वृद्धि की जाती है।

+0

मुझे समझ में नहीं आता क्यों 'x = true; y = true; c(); d() 'संभव नहीं है? यह 0 होना चाहिए। इसके अलावा मुझे नहीं पता कि मुझे परिणाम के रूप में 2 बहुत कुछ क्यों मिलता है। –

+1

@ एसिडज़ॉम्बी 24, उस मामले में भी, 'z' 2. – MSN

+0

मैं गड़बड़ कर दूंगा, मैं कोड को गलत तरीके से पढ़ता हूं। यह अब सही समझ में आता है –

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