2009-10-06 8 views
31

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

उत्तर

3

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

+0

जबकि एक लेखक धागा करता है (fetch-> write-> store) मैं नहीं देखता कि उन पाठकों के बीच में जब कोई पाठक एक अनिर्धारित मूल्य प्राप्त करेगा, या तो पिछले या बाद में एक, लेकिन कभी भी अनिर्धारित नहीं होगा। –

+0

खाता एनम मानों को ध्यान में रखते हुए जो एक निर्देश में पढ़े जाते हैं। –

+1

@ अरकाट्ज़: अनिर्धारित शायद सही शब्द नहीं था। लेकिन सीपीयू/मेमोरी आर्किटेक्चर कैश के अतिरिक्त स्तर, बढ़ी हुई लेटेंसी आदि के साथ अधिक से अधिक जटिल हो जाते हैं। उत्तर सरल है: नहीं कहो! डेटा के लॉकफ्री साझा करने के लिए। यहां तक ​​कि विशेषज्ञ भी इस क्षेत्र में कई गलतियां करते हैं। – sellibitze

0

आम तौर पर आप नहीं करते हैं, अगर आपका चर "अस्थिर" के साथ घोषित किया गया है। और केवल अगर यह एक चर है - अन्यथा आपको संभावित दौड़ के बारे में वास्तव में सावधान रहना चाहिए।

+0

आप अस्थिर मामलों को क्यों सोचते हैं? – jalf

+1

@jalf: अस्थिर संकलक को अनुकूलन निष्पादित करने के लिए कहता है जो आपके कोड को चर की एक पुरानी प्रतिलिपि देखने का कारण बन सकता है। –

+2

लेकिन सवाल पुरानी प्रतियों के बारे में नहीं था। भले ही परिवर्तनीय अस्थिर नहीं है, यह जल्द या बाद में लिखा जाएगा। अस्थिरता के बावजूद यह परमाणु होगा, और अस्थिर भार/स्टोर की पुनरावृत्ति को रोकता नहीं है। तो अस्थिरता वास्तव में आपको इस मामले में कुछ भी नहीं खरीदती है। यह उस समस्या को हल नहीं करता है जिसे हल करने की आवश्यकता है, और यह किसी ऐसे हल को हल करता है जिसे हल किया गया हो। – jalf

0

enum (पढ़ने या लिखने) तक पहुंच की जानी चाहिए।

एक और बात: यदि थ्रेड विवाद कम है और धागे एक ही प्रक्रिया से संबंधित हैं तो गंभीर अनुभाग म्यूटेक्स से बेहतर होगा।

8

आपके पास दो धागे हैं, वे जानकारी का आदान-प्रदान करते हैं, हां आपको एक म्यूटेक्स चाहिए और आपको शायद सशर्त इंतजार की भी आवश्यकता है।

अपने उदाहरण में (state_ == स्थापित करें) इंगित करता है कि थ्रेड # 2 कनेक्शन/स्थिति शुरू करने के लिए थ्रेड # 1 की प्रतीक्षा कर रहा है। म्यूटेक्स या सशर्त/घटनाओं के बिना, थ्रेड # 2 को स्थिति को लगातार मतदान करना होता है।

प्रदर्शनों को बढ़ाने के लिए थ्रेड का उपयोग किया जाता है (या प्रतिक्रिया में सुधार), आम तौर पर मतदान के अंतराल के कारण बहुत सारे सीपीयू का उपभोग करके या लापरवाही शुरू करके मतदान में कमी आती है।

+0

+1। इसकी आवाज़ से उसके पास एक धागा है जिसे किसी अन्य परिवर्तन से राज्य परिवर्तन का जवाब देने की आवश्यकता होती है। यदि मामला सशर्त चर है तो यह अधिक अनुचित है। – Falaina

+0

@Ermelli क्या हमें अभी भी म्यूटेक्स की आवश्यकता है यदि हम व्यस्त प्रतीक्षा लूप का उपयोग करना चाहते हैं (क्योंकि लूप कुछ और कर सकता है) – Nick

0

असल में, पढ़ने के लिए ऑब्जेक्ट तक पहुंच को लॉक करने का कोई कारण नहीं है। आप इसे लिखते समय इसे लॉक करना चाहते हैं। यह वही है जो पाठक-लेखक लॉक है। जब तक कोई लेखन कार्य नहीं होता है तब तक यह ऑब्जेक्ट को लॉक नहीं करता है। यह प्रदर्शन में सुधार करता है और deadlocks को रोकता है। अधिक विस्तृत स्पष्टीकरण के लिए निम्न लिंक देखें:

wikipedia codeproject

12

यह निर्भर करता है।

सी ++ भाषा थ्रेड या परमाणुता के बारे में कुछ भी नहीं कहती है।

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

हालांकि, एक म्युटेक्स, या तुल्यकालन के कुछ अन्य रूप के बिना, संकलक और सीपीयू को पुन: व्यवस्थित करने के लिए स्वतंत्र हैं रीड और राईट है, तो कुछ भी और अधिक जटिल, कई चर तक पहुँचने से जुड़े कुछ भी, अभी भी सामान्य स्थिति में असुरक्षित है।

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

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

+0

जब तक आप एक अस्थिर निर्दिष्ट नहीं करते हैं (पढ़ना) शायद कभी नहीं किया जा सकता है। जल्द या बाद में पर्याप्त अच्छा नहीं है। – EFraim

+3

लेकिन अस्थिर, सीपीयू या कंपाइलर के साथ भी लिखने को पुन: व्यवस्थित कर सकते हैं, जिससे उन्हें अर्थहीन बना दिया जा सकता है। सही समाधान एक स्मृति बाधा है, और फिर अस्थिर केवल एक आवश्यक deoptimization है। – jalf

+0

@jalf: नहीं, अगर आपको केवल एक झंडा चाहिए। प्रश्न फिर से पढ़ें। – EFraim

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