2010-07-12 10 views
7

इसलिए मेरे पास एक मल्टीप्रोसेसर मशीन पर सी ++ में बूलियन प्रकार है। परिवर्तनीय जीवन को सत्य के रूप में शुरू करता है, और उसके बाद कुछ धागे होते हैं, जिनमें से कोई एक या अधिक इसे गलत होने के लिए लिख सकता है।क्या मुझे इस चर को लॉक से बचाने की ज़रूरत है?

साथ ही, ये थ्रेड भी इस स्थिति को अपने राज्य की जांच के लिए पढ़ सकते हैं। मुझे कोई परवाह नहीं है कि इस चर को पढ़ने से किसी भी लेखन के साथ सिंक्रनाइज़ किया जाता है, वे प्रत्येक कोड में विभिन्न स्थानों पर होते हैं, और इससे कोई फर्क नहीं पड़ता कि यह किसी विशेष लेखन से पहले या बाद में आता है। अब, क्या मुझे इस बुलियन के लिए ताला चाहिए?

एकमात्र तरीका मुझे लॉक की आवश्यकता होगी यदि बहुत कम स्तर पर, स्मृति दो प्रतिस्पर्धी लेखनों से दूषित हो सकती है। यदि, उदाहरण के लिए, प्रोसेसर ए पर एक असेंबली निर्देश बाइट को 0 लिख रहा है जो एक ही समय में बूलियन का प्रतिनिधित्व करता है क्योंकि प्रोसेसर बी वही कर रहा है ... और 0 लिखने के बजाय, स्मृति 22 या उसके साथ समाप्त होती है या कुछ कुछ। वह कुछ गड़बड़ कर सकता है।

तो, आम तौर पर, अगर proc ए स्मृति स्थान पर 3 लिख रहा है, जबकि proc B 7 लिख रहा है, सिंक्रनाइज़ेशन के साथ, क्या मुझे कम से कम 3 या 7 के साथ समाप्त होने की गारंटी है? या क्या स्मृति को तोड़ना इतना आसान है?

संपादित करें:

टिप्पणियों के लिए धन्यवाद। कुछ और जानकारी: पाठ्यक्रम के कार्यक्रम में सिंक्रनाइज़ेशन है। संक्षेप में, प्रश्न में ध्वज बता रहा है कि क्या एक निश्चित मेमोरी पूल "गंदे" है (इसे संकलित करने की आवश्यकता है)। इसलिए कोई भी धागा इस झंडे को झूठा सेट करने का फैसला कर सकता है (जिसका मतलब पूल गंदे है)। उदाहरण के लिए, पूल से स्मृति मुक्त करने से यह गंदा हो जाता है। कोई भी थ्रेड तब भी इस ध्वज को पढ़ सकता है और सिग्नल करने के लिए एक और झंडा सेट कर सकता है कि क्लीन-अप की आवश्यकता होती है - पूल से मेमोरी आवंटित होने पर यह चेक किया जाता है, अगर हम स्मृति पर कम होते हैं तो क्लीन-अप संकेत दिया जाता है। पुनरावृत्ति के बीच मेरे मास्टर महत्वपूर्ण खंड में कहीं भी, जहां प्रत्येक धागा प्रक्रिया के लिए अधिक डेटा देखने के लिए जाता है, मेरे पास थ्रेड इस दूसरे ध्वज की जांच करेंगे, और यह सुनिश्चित करने के लिए कुछ उचित करें कि: अन्य सभी पैर अपने वर्तमान पुनरावृत्ति को समाप्त करते हैं, एक धागा स्मृति को साफ करता है, पहला ध्वज वापस सत्य पर सेट करता है (जैसा कि पूल में गंदे नहीं है), दूसरा ध्वज वापस झूठी सेट करता है, और फिर सभी धागे को फिर से जारी करता है।

इसलिए मुझे नहीं लगता कि मुझे लॉक की आवश्यकता है क्योंकि: एक ताला यह सुनिश्चित करेगा कि एक ही समय में लिखना एक और लिखना या पढ़ना न हो। लेकिन कौन परवाह करता है, जब तक हार्डवेयर मुझे विफल नहीं करता है, तब तक सबसे खराब स्थिति-परिदृश्य यह है कि पढ़ना पहले या बाद में यादृच्छिक रूप से होता है - यह वही बात है जो तब होगा जब मैंने इसे लॉक से संरक्षित किया हो, बस तब हम वास्तव में सुनिश्चित करें कि यह पहले या बाद में आया था ...

मुझे लगता है कि ऊपर वर्णित दूसरे ध्वज पर एक ही तर्क लागू होता है।

+1

ब्याज से, आप पढ़ने के बारे में परवाह क्यों नहीं करते? मान लीजिए कि कुछ धागे ने झूठ लिखा है - तो अगर आपको परवाह नहीं है कि पढ़ने के परिणाम 'सत्य' या 'झूठी' में हैं, तो पढ़ने को परेशान क्यों करें? क्या यह सिर्फ "गलत" 'सत्य 'पढ़ता है हानिकारक है? –

उत्तर

7

यदि आप केवल चर की स्थिति की जांच कर रहे हैं और इसे एक दिशा में गलत पर सेट कर रहे हैं, तो इसके बारे में चिंता करने के लिए बहुत कुछ नहीं है सिवाय इसके कि कुछ थ्रेड्स को देखने में थोड़ा देर हो सकती है कि वेरिएबल पहले से सेट हो चुका है असत्य। (यह 'अस्थिर' कीवर्ड के उपयोग से कुछ डिग्री तक काटा जा सकता है।) फिर दो धागे इसे गलत पर सेट कर सकते हैं, जो कोई समस्या नहीं है क्योंकि चर एक दिशा में एक ही मान पर सेट है। मान लीजिए कि बुलियन मेमोरी लोकेशन पर लिखते हैं, परमाणु होने की गारंटी नहीं है, नुकसान क्या है? अंतिम मूल्य वे दोनों लिखेंगे वही है।

  • मूल्य सेटिंग केवल एक दिशा नहीं है::

    फिर भी, आप ताला लगा की एक विधि का उपयोग करने के लिए होता है आप, फिर वापस, सच तो गलत पर फिर से गलत पर सेट, आदि

  • आप उस जानकारी पर कुछ निर्भर कार्रवाई करते हैं जो थ्रेड ने मूल्य को गलत पर सेट किया था। क्योंकि स्पष्ट रूप से दो विजेता हो सकते हैं।
3

चीजों को तोड़ने का यह एक आसान तरीका है। एक बुलियन के साथ, आप ज्यादातर समय ठीक हो सकते हैं, लेकिन कोई गारंटी नहीं दी जाती है।

आपके पास दो विकल्प हैं: एक म्यूटेक्स (लॉक) का उपयोग करें, या परमाणु प्राइमेटिव का उपयोग करें। परमाणु primitives परीक्षण करने के लिए हार्डवेयर निर्देशों का उपयोग करेंगे और एक वास्तविक म्यूटेक्स की आवश्यकता के बिना एक थ्रेड-सुरक्षित फैशन में संचालन सेट करें और हल्का वजन समाधान होगा। जीएनयू कंपाइलर आर्किटेक्चर-विशिष्ट एक्सटेंशन के माध्यम से परमाणु संचालन तक पहुंच प्रदान करता है। पोर्टेबल परमाणु संचालन पुस्तकालय भी तैर रहे हैं; Glib सी लाइब्रेरी परमाणु संचालन प्रदान करता है जो परमाणु प्राइमेटिव उपलब्ध नहीं होने पर एक म्यूटेक्स का उपयोग करने के लिए वापस आते हैं, हालांकि यह कई अन्य विशेषताओं के साथ काफी भारी लाइब्रेरी है।

Boost.Atomic लाइब्रेरी है जो सी ++ के लिए परमाणु संचालन को सारणीबद्ध करती है; इसके नाम पर आधारित, ऐसा लगता है कि यह Boost सी ++ लाइब्रेरी संग्रह में शामिल होना है, लेकिन अभी तक इसे अभी तक नहीं बनाया है।

1

एक बूल के लिए, आमतौर पर उत्तर नहीं होता है, म्यूटेक्स की आवश्यकता नहीं होती है, लेकिन (जैसा कि माइकल ई ने नोट किया) कुछ भी हो सकता है, इसलिए आपको ऐसा निर्णय लेने से पहले अपने कमान के बारे में और अधिक समझने की आवश्यकता है। एक और नोट: कोड को अभी भी बूल से जुड़े समग्र तर्क के चारों ओर एक ताला की आवश्यकता हो सकती है, खासकर अगर बूल को नियमित रूप से तर्क के दौरान एक से अधिक बार पढ़ा जाता है।

कुछ महान ब्लॉग मैं मुझे मेरी बहु पैर की उंगलियों पर रखने के लिए पढ़ें:

http://blogs.msdn.com/b/nativeconcurrency/

http://herbsutter.com/2009/04/20/effective-concurrency-use-thread-pools-correctly-keep-tasks-short-and-nonblocking/

सादर,

9

सबसे वस्तु हार्डवेयर पर एक शब्द भी पढ़ता/राईट परमाणु कर रहे हैं , इसलिए नहीं, दो (या अधिक) प्रतिस्पर्धी लिखते हैं (और पढ़ते हैं) उसी स्मृति स्थान पर मूल्य को भ्रष्ट नहीं करेंगे। सीपीयू के बीच कैश समेकन यहां महत्वपूर्ण क्या है।

फिर, वस्तु हार्डवेयर पर आप सिर्फ इतना है कि एक बूलियन चर volatile (जो btw समवर्ती प्रोग्रामिंग के लिए बेकार घोषित किया गया है) यह एक रजिस्टर में बाहर के अनुकूलन से संकलक को रोकने के लिए अंकन लेकिन केवल आप अगर वास्तव में डॉन के साथ भाग मिल सकता है लिखने के आदेश के बारे में परवाह नहीं है।

मुझे एक चेक-सूची के साथ इस फिर से पुनरावृति करते हैं:

  • आप करते हैं कि बूलियन में कुछ अपडेट खो तैयार हैं?
  • आप सुनिश्चित हैं कि अन्य स्मृति अपडेट कि स्रोत कोड में बूलियन फ्लिप पहले आते हैं लेकिन कि फ्लिप के बाद पुनर्क्रमित हो सकता है ऊपर गड़बड़ बातें करने के लिए जा रहे हैं?
  • क्या आप वाकई अपने आवेदन में घटनाओं के क्रम की परवाह नहीं करते हैं?

आप तीन मजबूत "हाँ" जवाब है, तो आप दूर है कि झंडा की रक्षा नहीं के साथ मिल सकता है। वैरिएबल पढ़ने से पहले मेमोरी बाधा प्राप्त करने पर विचार करें, और इसे लिखने से पहले स्मृति बाधा रिलीज़ करें। मेरा सुझाव हालांकि डिजाइन को फिर से सोचना होगा, और स्पष्ट सिंक्रोनस इंटर-थ्रेड संचार और घटना अनुक्रमित करना होगा।

उम्मीद है कि इससे मदद मिलती है।

+0

ग्रेट उत्तर, कैश समेकन का उल्लेख करने के लिए धन्यवाद। –

+0

1) आप कहते हैं कि उस बुलियन को अपडेट खोना ... क्या आपका मतलब है कि हार्डवेयर एक लेख को अनदेखा कर देगा? मुझे ऐसा नहीं लगता है, इसलिए मुझे यकीन नहीं है कि आपका क्या मतलब है (आप ऊपर मेरे परिशिष्ट देख सकते हैं) 2) हाँ 3) कुछ चीजें जिनकी मुझे परवाह है। ध्यान दें कि मैं कोड के उसी ब्लॉक में इस ध्वज को कभी भी पढ़ और लिखता हूं। हमेशा एक बार पढ़ें या एक बार लिखें। - यह अनिवार्य रूप से क्यों सिंक्रनाइज़ेशन बेकार लगता है। मुझे लगता है कि हमें अस्थिरता के लिए उपयोग मिला है! :) – Scott

+0

यह भी ध्यान रखना महत्वपूर्ण है कि मैं यहां कहीं भी "प्रतीक्षा करें .." परिदृश्य मॉडलिंग नहीं कर रहा हूं। मैं कभी भी धागे को झूठी प्रतीक्षा नहीं करना चाहता, या कुछ भी इंतजार नहीं करना चाहता। जाओ जाओ जाओ! – Scott

1

आप दो चीजें पूछ रहे हैं।

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

माध्यमिक आप समानांतर लिखने के कारण डेटा के भ्रष्टाचार के बारे में पूछ रहे हैं - अभ्यास में सीपीयू से स्मृति तक परिवहन बस में किया जाता है, जिसमें लगभग हमेशा बिट्स होते हैं आदिम प्रकारों से आप काम कर रहे हैं। तो ऐसा भ्रष्टाचार बहुत अजीब वास्तुकला के लिए हो सकता है या बड़ी संख्या में काम करते समय (सिस्टम द्वारा समर्थित रूप से समर्थित नहीं)। अभ्यास में आपको आमतौर पर 3 या 7 मिलेंगे। लेकिन फिर से, आप इस पर भरोसा नहीं कर सकते हैं।

यह निष्कर्ष निकालने के लिए - आपको लॉक की आवश्यकता है।

1

अधिकांश कमोडिटी हार्डवेयर पर एक शब्द पढ़ने और लिखने परमाणु संचालन नहीं होते हैं; याद रखें कि आपके पास वर्चुअल मेमोरी मशीनें हैं और इनमें से किसी भी ऑपरेशन में पेज गलती हो सकती है।

अधिक सामान्य शब्दों में आपको म्यूटेक्स का उपयोग नियमित रूप से आसान और तेज़ करने के लिए आसान होगा क्योंकि आपके सिर को खरोंच करने से पहले आप सोच रहे हैं कि क्या आप इस समय बिना किसी से दूर जा रहे हैं। जहां वह जरूरी नहीं है वहां एक बग का कारण नहीं है; एक जहां बाहर हो सकता है छोड़कर।

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