मैंने वास्तव में दोनों तरीकों से दावों को सुना है। मुझे संदेह है कि वे नहीं हैं, लेकिन मैं विषय सुलझाना चाहता था।सी ++ में पॉइंटर असाइनमेंट परमाणु है?
उत्तर
सी ++ 03 थ्रेड के अस्तित्व के बारे में नहीं जानता है, इसलिए परमाणुता की अवधारणा सी ++ 03 के लिए ज्यादा समझ नहीं लेती है, जिसका अर्थ है कि यह इसके बारे में कुछ भी नहीं कहता है।
सी ++ 11 धागे के बारे में जानता है, लेकिन एक बार फिर पॉइंटर्स असाइन करने की परमाणुता के बारे में कुछ भी नहीं कहता है। हालांकि सी ++ 11 में std::atomic<T*>
है, जो परमाणु होने की गारंटी है।
ध्यान दें कि यहां तक कि यदि कच्चे सूचक को लिखना आपके मंच पर परमाणु है, तो संकलक अभी भी उस आकलन को स्थानांतरित करने के लिए स्वतंत्र है, जिससे वास्तव में आपको कुछ भी खरीद नहीं आता है।
आप एक सूचक जो धागे के बीच साझा किया जाता है करने के लिए लिखने के लिए की जरूरत है या तो std::atomic<T*>
(या अभी तक आधिकारिक नहीं boost::atomic<T*>
, परमाणु intrinsics या विंडोज़ Interlocked * gccs) का उपयोग करें या लपेट सभी mutexes में है कि सूचक को एक्सेस करता है।
आप यहां boost.atomic प्राप्त कर सकते हैं: http://www.chaoticmind.net/~hcb/projects/boost.atomic /doc/index.html –
सी ++ मानक विशिष्ट थ्रेडिंग व्यवहार को परिभाषित नहीं करता है। कंपाइलर और प्लेटफ़ॉर्म के आधार पर, सूचक असाइनमेंट परमाणु हो सकता है या नहीं भी हो सकता है।
सी ++ 11 * करता है * एक थ्रेडिंग व्यवहार और संबंधित मेमोरी मॉडल को परिभाषित करता है। –
@ फ़्रिज़लाब और जेएन। आप दोनों सही हैं। जैसा कि कह रहा है कि पोर्श एक स्पोर्ट कार एक सही लेकिन अपरिहार्य है, क्योंकि हर मॉडल एक स्पोर्ट कार नहीं है :) – mloskot
यह भी देखें http://stackoverflow.com/questions/54188/are-c-reads-and-writes-of-an-int-atomic – sth
सी ++ को 'परमाणु' की आवश्यकता नहीं होगी यदि वह मामला था :) –