मैंने std::mutex
का उपयोग करके अधिकांश उदाहरण देखे हैं जहां म्यूटेक्स वैश्विक है। मैं सोच रहा था कि ऐसा कोई विशिष्ट कारण क्यों है? मेरे पास अपने स्वयं के कार्यक्रम हैं जहां मैं ऐसा नहीं करता हूं, और बस std::thread
std::ref
के रूप में mutex को पास करता हूं। क्या ग्लोबल्स होने का बुरा अभ्यास नहीं है, सी ++ में ग्लोबल std::mutexes
के पीछे तर्कसंगत क्या है यदि ऐसा करने के लिए कोई कारण प्रतिबंधित नहीं है?क्या कोई कारण है C++ 11+ std :: mutex को std :: thread में फ़ंक्शन पैरामीटर के रूप में पारित करने के बजाय वैश्विक चर के रूप में घोषित किया जाना चाहिए?
उत्तर
ग्लोबल्स होने के बावजूद यह खराब अभ्यास है जब यह नहीं है। उदाहरण के लिए, std::cin
वैश्विक है।
म्यूटेक्स एक भावनात्मक वैश्विक हैं, भले ही आप उन्हें कैसे उपलब्ध कराते हैं। वे कोड के अलग-अलग टुकड़ों के बीच साझा किए जाते हैं। तो आप उन्हें ग्लोबल्स बना सकते हैं, या आप कॉल श्रृंखला को उन कार्यों के माध्यम से पारित कर सकते हैं जो उनका उपयोग नहीं करते हैं, जब तक आप अंततः किसी ऐसे व्यक्ति तक नहीं पहुंच जाते। इसे "ट्रम्प डेटा" के रूप में जाना जाता है और यह भी "खराब अभ्यास" है। अपना जहर चुनें।
साइड नोट: आप डेटा के विभिन्न टुकड़ों (म्यूटेक्स, आदि) को एक ही ऑब्जेक्ट में एक साथ रखकर ट्रम्प की संख्या को कम से कम कम कर सकते हैं; तो आपको केवल कई लोगों की बजाय कॉल श्रृंखला के नीचे एक तर्क पारित करना होगा। –
@ जेरेमी फ़्रीज़नर - हाँ, आप खराब डिजाइन को लागू करने के लिए सरल बनाने के लिए अंतर्निहित प्रकार बना सकते हैं।
कुछ लोगों को '
सबसे अधिक संभावना यह उदाहरण को आसान बनाने के लिए किया गया था, जिससे म्यूटेक्स का उपयोग सटीक विनिर्देशों के बजाय उदाहरण का ध्यान केंद्रित करने की अनुमति देता है।
आमतौर पर एक म्यूटेक्स संसाधन की सुरक्षा करता है और कई मामलों में यह म्यूटेक्स संसाधन के साथ रहने के लिए समझ में आता है। उदाहरण के लिए यदि आपके पास सदस्य कंटेनर वाला एक वर्ग है जिसे म्यूटेक्स द्वारा संरक्षित करने की आवश्यकता है, तो म्यूटेक्स को कक्षा का सदस्य भी बनाएं। फिर क्लास इंस्टेंस को कई थ्रेडों द्वारा क्रियान्वित किया जाता है क्योंकि सदस्य-म्यूटेक्स को आंतरिक कंटेनर में आवश्यक पहुंचों की सुरक्षा के लिए उपयोग किया जा सकता है।
- 1. फ़ंक्शन के अंदर लाभार्थी के रूप में इलाज पैरामीटर के रूप में पारित किया गया है?
- 2. क्या कक्षा के सदस्य के रूप में std :: thread होने का कोई सुरक्षित तरीका है?
- 3. std :: unique_ptr std :: thread
- 4. std :: टेम्पलेट पैरामीटर के रूप में कार्य
- 5. std :: thread C++। अधिक स्टूडियो समान डेटा
- 6. सी ++ 11 लैम्ब्डा पैरामीटर के रूप में पासिंग फ़ंक्शन
- 7. त्रुटि: हटाए गए फ़ंक्शन 'std :: thread :: thread (const std :: thread &)'
- 8. बूस्ट :: mutex std :: mutex से बनाम2013 के रूप में क्यों तेज है?
- 9. फ़ंक्शन को "इनलाइन" के रूप में घोषित करने के लाभ?
- 10. थ्रेड द्वारा बुलाए जाने वाले फ़ंक्शन के पैरामीटर के रूप में mutex को क्यों पास किया जाए?
- 11. std :: thread
- 12. क्या std :: lock_guard <std::mutex> लॉक (एम) के लिए कोई शॉर्टेंड है?
- 13. फ़ंक्शन पैरामीटर के रूप में `std :: function` के साथ एक वैरिएडिक टेम्पलेट फ़ंक्शन कैसे बनाएं?
- 14. std :: thread कितना मानक है?
- 15. QThread बनाम std :: thread
- 16. सी ++ 11 variadic std :: फ़ंक्शन पैरामीटर
- 17. क्या इंटर-प्रोसेसर कोड में `std :: mutex` और` std :: lock` गारंटी स्मृति सिंक्रनाइज़ेशन है?
- 18. std :: atomic_compare_exchange_strong कब उपयोग किया जाना चाहिए?
- 19. std :: thread :: सेगमेंटेशन गलती :: आईडी के std :: ऑपरेटर ==
- 20. सीडी ++ 0x/C++ 11 में lambda फ़ंक्शन के साथ std :: सॉर्ट काम करना चाहिए?
- 21. -std = C++ 11 और -std = gnu ++ 11 के बीच अंतर क्या हैं?
- 22. क्या ऑपरेटरों को दोस्तों के रूप में घोषित किया जाना चाहिए?
- 23. पाइटेस्ट स्थिरता को पारित पैराम एक चर के रूप में पारित किया जा सकता है?
- 24. क्या फ़ंक्शन में पारित चर के नाम को खोजने के लिए जावा में कोई तरीका है?
- 25. std :: condition_variable इसकी आवश्यकता क्यों है std :: mutex
- 26. सदस्य चर के रूप में std :: startizer_list का उपयोग कर
- 27. std :: unique_lock <std::mutex> या std :: lock_guard <std::mutex>?
- 28. फ़ंक्शन टेम्पलेट पैरामीटर के रूप में पास ऑपरेटर
- 29. क्या C++ में टेम्पलेट पैरामीटर के रूप में कोई फ़ंक्शन (-नाम) होना संभव है?
- 30. std :: lock_guard के कारण अपरिभाषित व्यवहार
कोई कारण नहीं। उदाहरण के लिए कोड को काटने के लिए शायद यह किया गया था। – NathanOliver
शायद क्योंकि लेखक 'std :: context_wrapper' के वाक्यविन्यास से नफरत करता है;) –
यह पूरी तरह से निर्भर करता है। क्या वे काफी मामूली कार्यक्रम हैं? क्या उनमें एक से अधिक फाइलें हैं? कुछ और जानकारी चाहिये। आमतौर पर ग्लोबल को खराब अभ्यास माना जाता है और इससे बचा जाना चाहिए। आम तौर पर मेरे म्यूटेक्स वर्ग सदस्य चर होते हैं। लॉकिंग की आवश्यकता वाले ऑब्जेक्ट में उन्हें रखना अक्सर स्वाभाविक होता है। – Galik