2011-09-28 7 views
6

मेरे पास एक ही int चर पढ़ने वाले कई धागे हैं। और एक धागा मान लिख रहा है।कई धागे से पढ़ने के लिए int सुरक्षित है?

मुझे दौड़ की स्थिति की परवाह नहीं है।

केवल मेरी चिंता लिख ​​रही है और एक ही समय में int मान पढ़ना स्मृति सुरक्षित है?

और इसके परिणामस्वरूप कोई भी एप्लिकेशन क्रैश नहीं होगा।

+0

संभावित डुप्लिकेट [सी ++ पढ़ता है और एक परमाणु के लेखन] [http://stackoverflow.com/questions/54188/ए-सी-रीड-एंड-राइट-ऑफ-इंट-एटॉमिक) – Sjoerd

उत्तर

4

हां, यह ठीक होना चाहिए। एकमात्र तरीका यह है कि मैं क्रैशिंग की कल्पना कर सकता हूं कि अगर थ्रेड्स में से एक मेमोरी बैकिंग को पूर्णांक को हटा देता है। सर्वोत्तम परिणामों के लिए मैं यह भी सुनिश्चित करता हूं कि पूर्णांक sizeof(int) सीमाओं पर गठबंधन किए गए हैं। (कुछ सीपीयू इस संरेखण के बिना बिल्कुल पूर्णांक तक नहीं पहुंच सकते हैं। अन्य अनियंत्रित पहुंच के लिए परमाणु की कमजोर गारंटी प्रदान करते हैं।)

+1

का उल्लेख करते हुए सुनिश्चित करें कि पूर्णांक आकार (int) पर गठबंधन हैं, क्या आप कृपया इसके बारे में अधिक जानकारी प्रदान कर सकते हैं कि मैं यह कैसे कर सकता हूं? –

+0

@ विवेकगोएल ज्यादातर मामलों में आपका कंपाइलर आपके लिए यह करेगा। लेकिन इसे पूरा करने के लिए कंपाइलर विशिष्ट तरीके हैं, यानी जीसीसी के लिए '__attribute __ ((गठबंधन (4)))'। – asveikau

+0

@ विवेकगोएल - आप रनटाइम पर इसे जांचने के लिए भी चीजें कर सकते हैं, यानी ((uintptr_t) और x)% sizeof (int) 'शून्य होना चाहिए। (और आप इसके लिए 'जोर' भी जोड़ सकते हैं।) – asveikau

0

सभी लिनक्स प्लेटफॉर्म पर जिन्हें मैं जानता हूं, गठबंधन int के पढ़ने और लिखने परमाणु और सुरक्षित हैं। आप कभी भी ऐसा मूल्य नहीं पढ़ेंगे जो लिखा नहीं गया था (कोई शब्द फाड़ नहीं रहा)। आप कभी गलती या दुर्घटना नहीं करेंगे।

+0

मुझे लगता है कि इस प्रकार के व्यापक दावों को वास्तव में एक संदर्भ की आवश्यकता है। इसके अलावा, इस संदर्भ में ठीक से _what_ गठबंधन का मतलब है? – sehe

+0

यदि कोई नहीं जानता कि एक गठबंधन पूर्णांक क्या है, तो उनके पास बहु-थ्रेडेड प्रोग्राम नहीं हैं। –

+0

ओह असली आकर्षक। इसके अलावा, रास्ता सामान्यीकृत। खैर, आपको निश्चित रूप से परेशान करने की आवश्यकता नहीं है। एसओ पर अन्य जवाब हैं जो अधिक प्रकाश डालते हैं। – sehe

2

हां, x86 और x86-64 पर, जब तक आप जो मूल्य पढ़ रहे हैं उसे ठीक से गठबंधन किया गया है। 32-बिट int एस, पढ़ने या लिखने के दौरान atomic तक पहुंच के लिए उन्हें 4-बाइट सीमा पर गठबंधन करने की आवश्यकता है, जो लगभग हमेशा तब तक मामला नहीं होगा जब तक आप अनलिखित int एस (कहने के लिए अपने रास्ते से बाहर नहीं जाते , एक पैक संरचना का उपयोग करके या बाइट बफर के साथ कास्टिंग/पॉइंटर अंकगणित करके)।

आप शायद अपने चर को volatile के रूप में घोषित करना चाहते हैं ताकि संकलक कोड उत्पन्न करेगा जो हर बार एक्सेस होने पर मेमोरी से चर को फिर से लाएगा। इससे ऑप्टिमाइज़ेशन करने से रोका जा सकता है जैसे कि इसे किसी रजिस्टर में कैशिंग करना, जब इसे किसी अन्य थ्रेड द्वारा बदला जा सकता है।

+0

+1 और वास्तव में संरेखण मॉड्यूलस – sehe

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