मेरे पास एक कक्षा है जिसमें एक राज्य (एक साधारण enum) है और इसे दो धागे से एक्सेस किया जाता है। राज्य बदलने के लिए मैं एक म्यूटेक्स (बूस्ट :: म्यूटेक्स) का उपयोग करता हूं। क्या यह राज्य की जांच करना सुरक्षित है (उदा। राज्य_ == स्थापित करें) या क्या मुझे इस मामले में म्यूटेक्स का भी उपयोग करना है? दूसरे शब्दों में क्या मुझे म्यूटेक्स की आवश्यकता है जब मैं सिर्फ एक चर को पढ़ना चाहता हूं जिसे समसामयिक रूप से किसी अन्य थ्रेड द्वारा लिखा जा सकता है?क्या मुझे पढ़ने के लिए एक म्यूटेक्स चाहिए?
उत्तर
हां। यदि धागा एक चर को पढ़ता है जबकि थ्रेड बी इसे लिख रहा है, तो आप एक अपरिभाषित मान पढ़ सकते हैं। पढ़ना और लिखना ऑपरेशन परमाणु नहीं है, खासकर एक बहु-प्रोसेसर सिस्टम पर।
आम तौर पर आप नहीं करते हैं, अगर आपका चर "अस्थिर" के साथ घोषित किया गया है। और केवल अगर यह एक चर है - अन्यथा आपको संभावित दौड़ के बारे में वास्तव में सावधान रहना चाहिए।
आप अस्थिर मामलों को क्यों सोचते हैं? – jalf
@jalf: अस्थिर संकलक को अनुकूलन निष्पादित करने के लिए कहता है जो आपके कोड को चर की एक पुरानी प्रतिलिपि देखने का कारण बन सकता है। –
लेकिन सवाल पुरानी प्रतियों के बारे में नहीं था। भले ही परिवर्तनीय अस्थिर नहीं है, यह जल्द या बाद में लिखा जाएगा। अस्थिरता के बावजूद यह परमाणु होगा, और अस्थिर भार/स्टोर की पुनरावृत्ति को रोकता नहीं है। तो अस्थिरता वास्तव में आपको इस मामले में कुछ भी नहीं खरीदती है। यह उस समस्या को हल नहीं करता है जिसे हल करने की आवश्यकता है, और यह किसी ऐसे हल को हल करता है जिसे हल किया गया हो। – jalf
enum (पढ़ने या लिखने) तक पहुंच की जानी चाहिए।
एक और बात: यदि थ्रेड विवाद कम है और धागे एक ही प्रक्रिया से संबंधित हैं तो गंभीर अनुभाग म्यूटेक्स से बेहतर होगा।
आपके पास दो धागे हैं, वे जानकारी का आदान-प्रदान करते हैं, हां आपको एक म्यूटेक्स चाहिए और आपको शायद सशर्त इंतजार की भी आवश्यकता है।
अपने उदाहरण में (state_ == स्थापित करें) इंगित करता है कि थ्रेड # 2 कनेक्शन/स्थिति शुरू करने के लिए थ्रेड # 1 की प्रतीक्षा कर रहा है। म्यूटेक्स या सशर्त/घटनाओं के बिना, थ्रेड # 2 को स्थिति को लगातार मतदान करना होता है।
प्रदर्शनों को बढ़ाने के लिए थ्रेड का उपयोग किया जाता है (या प्रतिक्रिया में सुधार), आम तौर पर मतदान के अंतराल के कारण बहुत सारे सीपीयू का उपभोग करके या लापरवाही शुरू करके मतदान में कमी आती है।
+1। इसकी आवाज़ से उसके पास एक धागा है जिसे किसी अन्य परिवर्तन से राज्य परिवर्तन का जवाब देने की आवश्यकता होती है। यदि मामला सशर्त चर है तो यह अधिक अनुचित है। – Falaina
@Ermelli क्या हमें अभी भी म्यूटेक्स की आवश्यकता है यदि हम व्यस्त प्रतीक्षा लूप का उपयोग करना चाहते हैं (क्योंकि लूप कुछ और कर सकता है) – Nick
असल में, पढ़ने के लिए ऑब्जेक्ट तक पहुंच को लॉक करने का कोई कारण नहीं है। आप इसे लिखते समय इसे लॉक करना चाहते हैं। यह वही है जो पाठक-लेखक लॉक है। जब तक कोई लेखन कार्य नहीं होता है तब तक यह ऑब्जेक्ट को लॉक नहीं करता है। यह प्रदर्शन में सुधार करता है और deadlocks को रोकता है। अधिक विस्तृत स्पष्टीकरण के लिए निम्न लिंक देखें:
यह निर्भर करता है।
सी ++ भाषा थ्रेड या परमाणुता के बारे में कुछ भी नहीं कहती है।
लेकिन पर आधुनिक सीपीयू, एक पूर्णांक पढ़ने पर एक परमाणु ऑपरेशन होता है, जिसका अर्थ है कि आप हमेशा एक म्यूटेक्स के बिना भी एक सतत मूल्य पढ़ेंगे।
हालांकि, एक म्युटेक्स, या तुल्यकालन के कुछ अन्य रूप के बिना, संकलक और सीपीयू को पुन: व्यवस्थित करने के लिए स्वतंत्र हैं रीड और राईट है, तो कुछ भी और अधिक जटिल, कई चर तक पहुँचने से जुड़े कुछ भी, अभी भी सामान्य स्थिति में असुरक्षित है।
लेखक धागा मान लिया जाये कि कुछ डेटा अद्यतन करता है, और फिर एक पूर्णांक ध्वज सेट अन्य धागे कि डेटा उपलब्ध है सूचित करने के लिए, यह इतना झंडा डेटा अपडेट करने के से पहले सेट कर दिया जाता पुनर्क्रमित जा सकता है। जब तक आप एक mutex या स्मृति बाधा का एक अन्य रूप का उपयोग नहीं करते हैं।
तो यदि आप सही व्यवहार चाहते हैं, तो आपको म्यूटेक्स की आवश्यकता नहीं है, और यदि कोई अन्य धागा इसे पढ़ने के दौरान वैरिएबल को लिखता है तो कोई समस्या नहीं है। यह परमाणु होगा जब तक कि आप एक बहुत असामान्य सीपीयू पर काम नहीं कर रहे हैं।लेकिन आप को कंपाइलर या सीपीयू में पुनर्वितरण को रोकने के लिए किसी प्रकार की मेमोरी बाधा की आवश्यकता है।
जब तक आप एक अस्थिर निर्दिष्ट नहीं करते हैं (पढ़ना) शायद कभी नहीं किया जा सकता है। जल्द या बाद में पर्याप्त अच्छा नहीं है। – EFraim
लेकिन अस्थिर, सीपीयू या कंपाइलर के साथ भी लिखने को पुन: व्यवस्थित कर सकते हैं, जिससे उन्हें अर्थहीन बना दिया जा सकता है। सही समाधान एक स्मृति बाधा है, और फिर अस्थिर केवल एक आवश्यक deoptimization है। – jalf
@jalf: नहीं, अगर आपको केवल एक झंडा चाहिए। प्रश्न फिर से पढ़ें। – EFraim
- 1. क्या मुझे म्यूटेक्स का निपटान करना चाहिए?
- 2. क्या मुझे पढ़ने या लिखने के लिए एक मेमोरी एक्सेस पसंद करना चाहिए?
- 3. क्या मुझे एक एकल चर को लॉक करना चाहिए?
- 4. क्या मुझे प्रत्येक मॉडल के लिए एक इंटरफेस बनाना चाहिए?
- 5. क्या मुझे jQuery .ajax() के लिए एक CSRF टोकन चाहिए?
- 6. क्या मुझे सॉकेट्स को पढ़ने/लिखने के लिए फ़ाइल डिस्क्रिप्टर या स्ट्रीम का उपयोग करना चाहिए
- 7. म्यूटेक्स या म्यूटेक्स को नहीं?
- 8. क्या जेबीपीएम मुझे चाहिए?
- 9. मुझे क्या करना चाहिए?
- 10. क्या मुझे ओआरएम चाहिए?
- 11. रेल प्रक्रियाओं के लिए म्यूटेक्स
- 12. क्या मुझे एक फाइल खोलनी चाहिए या क्या मुझे अक्सर खोलना और बंद करना चाहिए?
- 13. मुझे एक एपीआई चाहिए। मुझे कहां से शुरू करना चाहिए?
- 14. क्या मुझे रिकॉर्ड पढ़ने के दौरान एसक्यूएल लेनदेन का उपयोग करना चाहिए?
- 15. क्या मुझे बिल्ली में हेड्रोक लिखने के लिए बिल्ली चाहिए?
- 16. एलएलवीएम आर्किटेक्चर के आधार पर पायथन के लिए फ्रंट एंड बनाने के लिए मुझे क्या चाहिए?
- 17. क्या मुझे जावा एप्लिकेशन बंडल बनाने के लिए मैक चाहिए?
- 18. क्या मुझे ऑटोव्यू के लिए इंतजार करना चाहिए?
- 19. क्या मुझे उपयोगकर्ता नियंत्रण के लिए आईडीस्पोज़ेबल लागू करना चाहिए?
- 20. क्या मुझे एक्सयूएल सीखना चाहिए?
- 21. आईआईएस पर PHP अनुप्रयोग चलाने के लिए मुझे क्या चाहिए?
- 22. क्या मुझे गैर-ASCII वर्णों के लिए web.config चाहिए?
- 23. क्या मुझे एनएचएएमएल सीखना चाहिए?
- 24. क्या मुझे आईपैयर या लूप के लिए उपयोग करना चाहिए
- 25. मुझे SimpleAdapter के अंदर एक छविदृश्य चाहिए?
- 26. क्या मुझे सुविधा ओवरलोड के लिए परीक्षण डुप्लिकेट करना चाहिए?
- 27. बेहतर डेवलपर बनने के लिए मुझे क्या लिखना चाहिए?
- 28. मुझे git user.name के लिए क्या उपयोग करना चाहिए?
- 29. क्या मुझे एंड्रॉइड एप्लिकेशन बनाने के लिए एंड्रॉइड फोन चाहिए?
- 30. क्या मुझे एल्गोरिदम के निष्पादन के लिए आवश्यक वस्तुओं को इंजेक्ट करना चाहिए? क्या मुझे सब कुछ इंजेक्ट करना चाहिए?
जबकि एक लेखक धागा करता है (fetch-> write-> store) मैं नहीं देखता कि उन पाठकों के बीच में जब कोई पाठक एक अनिर्धारित मूल्य प्राप्त करेगा, या तो पिछले या बाद में एक, लेकिन कभी भी अनिर्धारित नहीं होगा। –
खाता एनम मानों को ध्यान में रखते हुए जो एक निर्देश में पढ़े जाते हैं। –
@ अरकाट्ज़: अनिर्धारित शायद सही शब्द नहीं था। लेकिन सीपीयू/मेमोरी आर्किटेक्चर कैश के अतिरिक्त स्तर, बढ़ी हुई लेटेंसी आदि के साथ अधिक से अधिक जटिल हो जाते हैं। उत्तर सरल है: नहीं कहो! डेटा के लॉकफ्री साझा करने के लिए। यहां तक कि विशेषज्ञ भी इस क्षेत्र में कई गलतियां करते हैं। – sellibitze