2017-07-05 14 views
5

मैंने std::mutex का उपयोग करके अधिकांश उदाहरण देखे हैं जहां म्यूटेक्स वैश्विक है। मैं सोच रहा था कि ऐसा कोई विशिष्ट कारण क्यों है? मेरे पास अपने स्वयं के कार्यक्रम हैं जहां मैं ऐसा नहीं करता हूं, और बस std::threadstd::ref के रूप में mutex को पास करता हूं। क्या ग्लोबल्स होने का बुरा अभ्यास नहीं है, सी ++ में ग्लोबल std::mutexes के पीछे तर्कसंगत क्या है यदि ऐसा करने के लिए कोई कारण प्रतिबंधित नहीं है?क्या कोई कारण है C++ 11+ std :: mutex को std :: thread में फ़ंक्शन पैरामीटर के रूप में पारित करने के बजाय वैश्विक चर के रूप में घोषित किया जाना चाहिए?

+8

कोई कारण नहीं। उदाहरण के लिए कोड को काटने के लिए शायद यह किया गया था। – NathanOliver

+0

शायद क्योंकि लेखक 'std :: context_wrapper' के वाक्यविन्यास से नफरत करता है;) –

+1

यह पूरी तरह से निर्भर करता है। क्या वे काफी मामूली कार्यक्रम हैं? क्या उनमें एक से अधिक फाइलें हैं? कुछ और जानकारी चाहिये। आमतौर पर ग्लोबल को खराब अभ्यास माना जाता है और इससे बचा जाना चाहिए। आम तौर पर मेरे म्यूटेक्स वर्ग सदस्य चर होते हैं। लॉकिंग की आवश्यकता वाले ऑब्जेक्ट में उन्हें रखना अक्सर स्वाभाविक होता है। – Galik

उत्तर

4

ग्लोबल्स होने के बावजूद यह खराब अभ्यास है जब यह नहीं है। उदाहरण के लिए, std::cin वैश्विक है।

म्यूटेक्स एक भावनात्मक वैश्विक हैं, भले ही आप उन्हें कैसे उपलब्ध कराते हैं। वे कोड के अलग-अलग टुकड़ों के बीच साझा किए जाते हैं। तो आप उन्हें ग्लोबल्स बना सकते हैं, या आप कॉल श्रृंखला को उन कार्यों के माध्यम से पारित कर सकते हैं जो उनका उपयोग नहीं करते हैं, जब तक आप अंततः किसी ऐसे व्यक्ति तक नहीं पहुंच जाते। इसे "ट्रम्प डेटा" के रूप में जाना जाता है और यह भी "खराब अभ्यास" है। अपना जहर चुनें।

+0

साइड नोट: आप डेटा के विभिन्न टुकड़ों (म्यूटेक्स, आदि) को एक ही ऑब्जेक्ट में एक साथ रखकर ट्रम्प की संख्या को कम से कम कम कर सकते हैं; तो आपको केवल कई लोगों की बजाय कॉल श्रृंखला के नीचे एक तर्क पारित करना होगा। –

+0

@ जेरेमी फ़्रीज़नर - हाँ, आप खराब डिजाइन को लागू करने के लिए सरल बनाने के लिए अंतर्निहित प्रकार बना सकते हैं। गंभीरता से, हालांकि, यह एक वैध तकनीक हो सकती है। इसका जिक्र करने के लिए धन्यवाद। –

+0

कुछ लोगों को '' में वैश्विक के बारे में आलोचनाएं हैं ... ऐसा इसलिए नहीं है क्योंकि यह 'std' में ऐसा किया जाता है कि यह सही तरीका है। – Jarod42

0

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

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

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