मान लें कि x86 CPU0 और CPU1 पर क्रमशः दो धागे चल रहे हैं। थ्रेड CPU0 पर चल कार्यान्वित निम्न कमांड:x86 पर दो परिणामी सीपीयू स्टोर ऑर्डर रखने वाले कैश में फंस गए हैं?
A=1
B=1
कैश लाइन युक्त शुरू में CPU1 द्वारा और युक्त बी CPU0 के स्वामित्व में है जिसका स्वामित्व।
अगर मैं सही ढंग से समझ, दोनों दुकानों सीपीयू की दुकान बफर में रखा जाएगा:
मैं दो प्रश्न हैं। हालांकि, पहली स्टोर
A=1
सीपीयू 1 के कैश को अमान्य किया जाना चाहिए जबकि दूसरी दुकानB=1
तुरंत फ्लश किया जा सकता है क्योंकि CPU0 में कैश लाइन है। मुझे पता है कि x86 CPU स्टोर ऑर्डर का सम्मान करता है। क्या इसका मतलब है किA=1
से पहले कैश में नहीं लिखा जाएगा?CPU1 में मान लें निम्न कमांड क्रियान्वित कर रहे हैं:
जबकि (बी = 0);
प्रिंट एक
यह काफी CPU0 में A=1
और B=1
जो sfence जोड़ने हो 1 हमेशा 86 पर बाहर मुद्रित करने के लिए बिना CPU1 में while
और print
आदेशों के बीच केवल lfence जोड़ने के लिए है?
while (B=0);
lfence
print A
भले ही x86 इसकी गारंटी देता है, जोखिम क्यों लें? क्यों न केवल सही बाधाओं का उपयोग करें? –
ज़ैन, यदि सीपीयू इसकी गारंटी देता है तो यह कई स्थानों पर लाभ का हो सकता है। उदाहरण के लिए स्पिनलॉक्स को कर्नेल में किसी भी लॉक उपसर्ग का उपयोग किए बिना कार्यान्वित किया जाता है क्योंकि वे इसे बर्दाश्त कर सकते हैं। और बाड़ इस सवाल का हल नहीं है अन्यथा, किसी को उचित लॉक का उपयोग करने की आवश्यकता है। – Saurabh
** 1-सेंट प्रश्न का उत्तर - हाँ **। ** 2-nd प्रश्न का उत्तर - हां, लेकिन केवल असेंबलर में (सी/सी ++ में नहीं) **। जैसा कि सही कहा गया है, x86 पर यहां 'LFENCE' की आवश्यकता नहीं है - यह स्वचालित रूप से स्थिरता प्रदान करता है। ध्यान दें कि x86 CPU 'लोड' और किसी भी अगले निर्देश को पुन: व्यवस्थित नहीं कर सकता है, लेकिन सी/सी ++ इसे पुन: व्यवस्थित कर सकता है। सी ++ पर आपने उपयोग को ढाल दिया ** स्थिरता प्राप्त करें **: 'बाहरी std :: परमाणु बी; '' जबकि (बीलोड (std :: memory_order_acquire) == 0); '' std :: cout << ए; ' http://en.cppreference.com/w/cpp/atomic/memory_order –
Alex