2008-09-10 16 views
69

मेरे पास दो धागे हैं, एक int को अपडेट कर रहा है और इसे पढ़ रहा है। यह एक सांख्यिकीय मूल्य है जहां पढ़ने और लिखने का क्रम अप्रासंगिक है।सी ++ एक परमाणु पर पढ़ता है और लिखता है?

मेरा सवाल है, क्या मुझे इस बहु-बाइट मूल्य तक पहुंच को सिंक्रनाइज़ करने की आवश्यकता है? या, एक और तरीका डालें, लेखन का हिस्सा पूरा हो सकता है और बाधित हो सकता है, और फिर पढ़ा जाता है।

उदाहरण के लिए, एक मान = 0x0000FFFF के बारे में सोचें जो 0x00010000 के बढ़ते मूल्य को प्राप्त करता है।

क्या ऐसा समय है जहां मूल्य 0x0001FFFF जैसा दिखता है जिसके बारे में मुझे चिंतित होना चाहिए? निश्चित रूप से बड़ा प्रकार, ऐसा होने के लिए कुछ और संभव है।

मैंने हमेशा इन प्रकार के एक्सेस सिंक्रनाइज़ किए हैं, लेकिन यह समुदाय उत्सुकता से उत्सुक था।

+4

सच? मुझे परवाह नहीं होगा कि समुदाय ने क्या सोचा था। मुझे परवाह है कि तथ्यों क्या हैं :) – sehe

+1

विषय पर दिलचस्प पढ़ना: http://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012- हर्ब-टर- सैटॉमिक- वेपन्स -1- ऑफ-2 – ereOn

+0

विशेष रूप से '=' के लिए: http://stackoverflow.com/questions/8290768/is-assignment-operator-atomic –

उत्तर

39

पहले व्यक्ति को लगता है कि देशी मशीन आकार के पढ़ने और लिखने परमाणु हैं लेकिन प्रोसेसर/कोर के बीच कैश कोहेरेंसी सहित निपटने के लिए कई मुद्दे हैं। विंडोज़ पर इंटरलॉक * और लिनक्स पर समकक्ष परमाणु संचालन का प्रयोग करें। C++ 0x में एक अच्छा और क्रॉस-प्लेटफ़ॉर्म इंटरफ़ेस में इन्हें लपेटने के लिए "परमाणु" टेम्पलेट होगा। अभी के लिए यदि आप प्लेटफार्म एब्स्ट्रक्शन लेयर का उपयोग कर रहे हैं तो यह इन कार्यों को प्रदान कर सकता है। ACE करता है, कक्षा टेम्पलेट ACE_Atomic_Op देखें।

+0

ACE_Atomic_Op का दस्तावेज़ स्थानांतरित हो गया है - अब यह http://www.dre.vanderbilt.edu/~schmidt/DOC_ROOT/ACE/ace/Atomic_Op.inl – Byron

+0

पर पाया जा सकता है, मैंने लिंक –

0

नहीं, वे नहीं हैं (या कम से कम आप यह नहीं मान सकते हैं कि वे हैं)। ऐसा कहकर, परमाणु रूप से ऐसा करने के लिए कुछ चाल हैं, लेकिन वे आम तौर पर पोर्टेबल नहीं हैं (Compare-and-swap देखें)।

8

हां, आपको एक्सेस सिंक्रनाइज़ करने की आवश्यकता है। सी ++ 0x में यह एक डेटा रेस, और अपरिभाषित व्यवहार होगा। POSIX धागे के साथ यह पहले से ही अपरिभाषित व्यवहार है।

प्रैक्टिस में, यदि डेटा प्रकार देशी शब्द आकार से बड़ा है तो आपको खराब मान मिल सकते हैं। साथ ही, एक और थ्रेड पढ़ने और/या लिखने के अनुकूलन के कारण लिखे गए मूल्य को कभी नहीं देख सकता है।

3

आपको सिंक्रनाइज़ करना होगा, लेकिन कुछ आर्किटेक्चर पर इसे करने के प्रभावी तरीके हैं।

सबसे अच्छा subroutines (शायद मैक्रोज़ के पीछे मुखौटा) का उपयोग करना है ताकि आप सशर्त रूप से प्लेटफॉर्म-विशिष्ट वाले कार्यान्वयन को प्रतिस्थापित कर सकें।

लिनक्स कर्नेल में पहले से ही कुछ कोड है।

9

यदि आप 4-बाइट मान पढ़ रहे/लिख रहे हैं और यह स्मृति में DWORD- गठबंधन है और आप I32 आर्किटेक्चर पर चल रहे हैं, तो पढ़ते हैं और लिखते हैं परमाणु हैं।

+2

इंटेल आर्किटेक्चर सॉफ़्टवेयर डेवलपर मैनुअल में कहां कहा गया है? –

+1

@DanielTrebbien: शायद http: // stackoverflow देखें।कॉम/प्रश्न/5002046/परमाणुता-इन-सी-मिथक-या-रियलिटी – sehe

57

लड़का, क्या सवाल है। इस सवाल का जवाब है जो करने के लिए है:

हाँ, नहीं, हममम, ठीक है, यह

निर्भर करता है यह सब प्रणाली की वास्तुकला के लिए नीचे आता है। एक आईए 32 पर एक सही गठबंधन पता एक परमाणु ऑपरेशन होगा। असाइन किए गए लेखन परमाणु हो सकते हैं, यह उपयोग में कैशिंग सिस्टम पर निर्भर करता है। अगर स्मृति एक एल 1 कैश लाइन के भीतर है तो यह परमाणु है, अन्यथा यह नहीं है। सीपीयू और रैम के बीच बस की चौड़ाई परमाणु प्रकृति को प्रभावित कर सकती है: एक 8086 पर सही ढंग से गठबंधन 16 बिट लिखना परमाणु था, जबकि 8088 पर एक ही लिखना ऐसा नहीं था क्योंकि 8088 में केवल 8 बिट बस थी जबकि 8086 में एक था 16 बिट बस

इसके अलावा, यदि आप सी/सी ++ का उपयोग कर रहे हैं तो साझा मूल्य को अस्थिर के रूप में चिह्नित करना न भूलें, अन्यथा ऑप्टिमाइज़र सोचेंगे कि चर आपके किसी भी थ्रेड में कभी अपडेट नहीं होता है।

+14

अस्थिर कीवर्ड बहुप्रचारित कार्यक्रमों में उपयोगी नहीं है http://stackoverflow.com/questions/2484980/why-is-volatile-not-Considered-useful -in-multithreaded-c-or-c-प्रोग्रामिंग –

+3

@IngeHenriksen: मुझे उस लिंक से आश्वस्त नहीं है। – Skizz

0

मैं कई और विशेष रूप से Jason से सहमत हूं। विंडोज़ पर, एक इंटरलॉकएड और उसके दोस्तों का उपयोग करेगा।

1

प्रत्येक व्यक्ति ने ऊपर जो कहा है उसे प्रतिबिंबित करने के लिए, भाषा प्री-सी ++ 0x एकाधिक थ्रेड से साझा स्मृति पहुंच के बारे में कुछ भी गारंटी नहीं दे सकती है। कोई भी गारंटी संकलक तक होगी। जैसा कि ऊपर उल्लेख कैश मुद्दे से

0

Asside ...

इसे अब और परमाणु नहीं होंगे, तो आप एक छोटे रजिस्टर आकार के साथ एक प्रोसेसर के कोड बंदरगाह।

आईएमओ, थ्रेडिंग मुद्दे इसे जोखिम देने के लिए बहुत कांटेदार हैं।

3

विंडोज़ पर, इंटरलॉक *** एक्सचेंज *** जोड़ें परमाणु होने की गारंटी है।

-1

एकमात्र पोर्टेबल तरीका आपके कंपाइलर के लिए signal.h शीर्षलेख में परिभाषित sig_atomic_t प्रकार का उपयोग करना है। अधिकांश सी और सी ++ कार्यान्वयन में, यह एक int है। फिर अपने चर को "अस्थिर sig_atomic_t" घोषित करें।

+0

अस्थिरता को अपडेट नहीं किया है आपको लगता है कि यह http://stackoverflow.com/questions/2484980/why-is-volatile-not-Considered-useful-in-multithreaded-c-or-c-programming –

0

इस उदाहरण

int x; 
x++; 
x=x+5; 

पहले बयान है क्योंकि यह एक भी कांग्रेस विधानसभा निर्देश है कि एक CPU चक्र लेता करने के लिए अनुवाद परमाणु माना जाता है चलो। हालांकि, दूसरे असाइनमेंट के लिए कई परिचालनों की आवश्यकता होती है, इसलिए यह स्पष्ट रूप से परमाणु संचालन नहीं है।

एक और उदा,

x=5; 

फिर से, आप को देखने के लिए वास्तव में यहाँ होता है क्या कोड एकत्रित न करने के लिए है।

+0

लेकिन संकलक इसे 'x + = 6'। –

0

टीसी, मुझे लगता है कि जिस क्षण आप निरंतर उपयोग करते हैं (जैसे 6), निर्देश एक मशीन चक्र में पूरा नहीं होगा। x ++

0

की तुलना में x + = 6 के निर्देश सेट को देखने का प्रयास करें कुछ लोग सोचते हैं कि ++ सी परमाणु है, लेकिन असेंबली उत्पन्न हुई है। साथ उदाहरण के लिए 'जीसीसी एस':

movl cpt.1586(%rip), %eax 
addl $1, %eax 
movl %eax, cpt.1586(%rip) 

किसी पूर्णांक बढ़ाने के लिए, संकलक पहले एक रजिस्टर में इसे लोड, और यह स्टोर स्मृति में वापस। यह परमाणु नहीं है।

+1

यह कोई मुद्दा नहीं है यदि केवल एक धागा चर के लिए लिख रहा है, क्योंकि कोई फाड़ नहीं है। –

1

निश्चित रूप से नहीं! कि हमारी सर्वोच्च सी ++ प्राधिकरण से जवाब देने के, एम बूस्ट:
Operations on "ordinary" variables are not guaranteed to be atomic.

+0

वह लिंक केवल 'अंकगणितीय' ऑपरेशन कहता है जिसमें 'सामान्य' चर पर एक पठन-अद्यतन-लेखन अनुक्रम होता है, परमाणु नहीं है, न कि 'सामान्य' चर पर 'पढ़ा' या 'लिखना' ऑपरेशन परमाणु है या नहीं। – D3Hunter

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