यह ज्ञात है कि आपरेशन load()
और store()
स्मृति बाधाओं memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel
कैश और पाइप लाइन के लिए एक प्रोसेसर निर्देश की आवश्यकता नहीं है के लिए , और कोडांतरक के कोड पर हमेशा std::memory_order_relaxed
से मेल खाती है, और इन प्रतिबंधों केवल के अनुकूलन के लिए आवश्यक हैं संकलक: http://www.stdthread.co.uk/forum/index.php?topic=72.0क्या `std :: memory_order_acquire` के अर्थशास्त्र को x86/x86_64 पर प्रोसेसर निर्देशों की आवश्यकता है?
और यह कोड Disassembly कोड store()
(MSVS2012 x86_64) के लिए इस बात की पुष्टि करता:
std::atomic<int> a;
a.store(0, std::memory_order_relaxed);
000000013F931A0D mov dword ptr [a],0
a.store(1, std::memory_order_release);
000000013F931A15 mov dword ptr [a],1
लेकिन इस कोड load()
(MSVS2012 x86_64) के लिए इस comfirm नहीं करता है, का उपयोग कर lock cmpxchg
:
int val = a.load(std::memory_order_acquire);
000000013F931A1D prefetchw [a]
000000013F931A22 mov eax,dword ptr [a]
000000013F931A26 mov edx,eax
000000013F931A28 lock cmpxchg dword ptr [a],edx
000000013F931A2E jne main+36h (013F931A26h)
std::cout << val << "\n";
लेकिन Anthony Williams said:
some_atomic.load (std :: memory_order_acquire) बस करता है से एक साधारण लोड निर्देश, और some_atomic.store (std :: memory_order_release) एक साधारणतक गिर जाता हैस्टोर निर्देश।
कहाँ मैं गलत हूँ, और कहा के रूप में एंथनी विलियम्स std::memory_order_acquire
के शब्दों x86/x86_64 lock cmpxchg
पर प्रोसेसर निर्देश या केवल एक साधारण लोड अनुदेश mov
की आवश्यकता है?
उत्तर: यह इस बग रिपोर्ट के समान ही है: http://connect.microsoft.com/VisualStudio/feedback/details/770885
मुझे यकीन नहीं है कि कंपाइलर जेनरेट करता है, यह आवश्यक है कि किसी विशेष कार्यक्षमता की आवश्यकताओं को निर्धारित करने के लिए एक अच्छा तरीका है - यह अनदेखा नहीं है कि उन कंपाइलर्स "उन्हें जितना अधिक चाहिए" करता है। –
@ मैट पीटर्ससन हाँ, लेकिन कुछ भी करने से कहीं ज्यादा आसान नहीं है। और यह संकलक से आवश्यक था, 'mov' के अलावा कुछ भी नहीं। वास्तव में माइक्रोसॉफ्ट के डेवलपर्स इस सबसे सरल कार्य में विफल रहे हैं: "कुछ भी नहीं"? :) – Alex
मुझे पता है कि एमएस वीसी (कम से कम SOME संस्करण) 'अस्थिर' के रूप में घोषित चर पर अतिरिक्त "लॉकिंग" उत्पन्न करेगा - क्योंकि सी ++ मानक की आवश्यकता नहीं है, लेकिन क्योंकि कोड के कुछ बिट्स जो एकल कोर प्रोसेसर पर काम करने के लिए उपयोग किए जाते हैं यदि आप एसएमपी सिस्टम का उपयोग करते हैं तो खराब काम करें। यह उन स्थितियों में से एक जैसा दिखता है। –