सी ++ म्यूटेक्स लॉक

Si Myuteksa Loka



C ++ को अच्छे प्रदर्शन, उच्च परिशुद्धता और पर्याप्त मेमोरी प्रबंधन प्रणाली के साथ सबसे तेज प्रोग्रामिंग भाषाओं में से एक के रूप में जाना जाता है। यह प्रोग्रामिंग भाषा उनके बीच कई संसाधनों को साझा करने के साथ कई थ्रेड्स के समवर्ती निष्पादन का भी समर्थन करती है। मल्टीथ्रेडिंग में, थ्रेड केवल रीड ऑपरेशन करने के लिए होता है जिससे कोई समस्या नहीं होती है क्योंकि उस समय अन्य थ्रेड्स क्या कर रहे हैं, इससे थ्रेड प्रभावित नहीं होता है। लेकिन अगर इन थ्रेड्स को उनके बीच संसाधनों को साझा करना होता है, तो एक थ्रेड उस समय डेटा को संशोधित कर सकता है जिससे समस्या होती है। इस समस्या से निपटने के लिए, हमारे पास सी ++ 'म्यूटेक्स' है जो सिंक्रनाइज़ेशन प्रदान करके हमारे कोड/ऑब्जेक्ट की ओर एकाधिक संसाधनों की पहुंच को रोकता है जो बताता है कि ऑब्जेक्ट/कोड तक पहुंच एक समय में केवल एक थ्रेड को प्रदान की जा सकती है, ताकि एक से अधिक थ्रेड उस ऑब्जेक्ट को एक साथ एक्सेस न कर सकें।

प्रक्रिया:

हम यह जानेंगे कि म्यूटेक्स लॉक का उपयोग करके हम एक ही समय में किसी ऑब्जेक्ट तक कई थ्रेड्स की पहुंच को कैसे रोक सकते हैं। हम म्यूटेक्स लॉक के सिंटैक्स के बारे में बात करेंगे, मल्टीपल थ्रेडिंग क्या है, और म्यूटेक्स लॉक का उपयोग करके हम मल्टीपल थ्रेडिंग के कारण होने वाली समस्याओं से कैसे निपट सकते हैं। फिर, हम कई थ्रेडिंग का एक उदाहरण लेंगे और उन पर म्यूटेक्स लॉक लागू करेंगे।







वाक्य - विन्यास:

यदि हम सीखना चाहते हैं कि हम म्यूटेक्स लॉक को कैसे कार्यान्वित कर सकते हैं ताकि हम अपने ऑब्जेक्ट या कोड की ओर एक साथ कई थ्रेड्स की पहुंच को रोक सकें, तो हम निम्नलिखित सिंटैक्स का उपयोग कर सकते हैं:



$ एसटीडी :: म्युटेक्स mut_x

$mut_x. ताला ( ) ;

शून्य func_name ( ) {

$ // जिस कोड को हम कई थ्रेड्स से छिपाना चाहते हैं, वह यहां लिखा जाएगा

$mut_x. अनलॉक ( ) ;

}

अब हम इस सिंटैक्स का उपयोग डमी उदाहरण पर और छद्म कोड में करेंगे (जिसे हम कोड संपादक की तरह ही नहीं चला सकते हैं) आपको यह बताने के लिए कि हम इस सिंटैक्स का उपयोग कैसे कर सकते हैं जैसा कि निम्नलिखित में बताया गया है:



$ एसटीडी :: म्युटेक्स mut_x

शून्य ब्लॉक ( ) {

$mut_x. ताला ( ) ;

$ एसटीडी :: अदालत << 'नमस्ते' ;

$mut_x. अनलॉक ( ) ;

}

उदाहरण:

इस उदाहरण में, आइए पहले मल्टीथ्रेड ऑपरेशन बनाने का प्रयास करें और फिर इस ऑपरेशन को म्यूटेक्स लॉक के साथ घेर लें और बनाए गए कोड या ऑब्जेक्ट को ऑपरेशन का सिंक्रनाइज़ेशन प्रदान करने के लिए अनलॉक करें। म्यूटेक्स दौड़ की स्थिति से संबंधित है जो कि ऐसे मूल्य हैं जो काफी अप्रत्याशित हैं और वे समय के प्रति जागरूक थ्रेड्स के स्विचिंग पर निर्भर हैं। म्यूटेक्स के उदाहरण को लागू करने के लिए, हमें सबसे पहले रिपॉजिटरी से महत्वपूर्ण और आवश्यक पुस्तकालयों को आयात करना होगा। आवश्यक पुस्तकालय हैं:





$ # शामिल

$ # शामिल <धागा>

$ # शामिल <म्यूटेक्स>

'Iostream' लाइब्रेरी हमें डेटा को Cout के रूप में प्रदर्शित करने, डेटा को Cin के रूप में पढ़ने और स्टेटमेंट को एंडल के रूप में समाप्त करने के लिए एक फ़ंक्शन प्रदान करती है। हम थ्रेड से प्रोग्राम या फ़ंक्शन का उपयोग करने के लिए 'थ्रेड' लाइब्रेरी का उपयोग करते हैं। 'म्यूटेक्स' पुस्तकालय हमें कोड में म्यूटेक्स लॉक और अनलॉक दोनों को लागू करने की अनुमति देता है। हम '# शामिल' का उपयोग करते हैं क्योंकि यह कोड में शामिल पुस्तकालय से संबंधित सभी कार्यक्रमों की अनुमति देता है।

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



mutex.lock() हमारे बनाए गए ऑब्जेक्ट या कोड तक पहुंचने के लिए अन्य थ्रेड्स की पहुंच से इनकार करता है ताकि एक समय में केवल एक थ्रेड हमारे ऑब्जेक्ट को पढ़ सके। तर्क में, हम एक लूप के लिए चलाते हैं जो 0 से 9 तक इंडेक्स पर चलता है। हम लूप में मान प्रदर्शित करते हैं। एक बार जब यह तर्क म्यूटेक्स लॉक में इसके संचालन के बाद या तर्क से बाहर निकलने के बाद बनाया जाता है, तो हम 'म्यूटेक्स.अनलॉक ()' विधि को कॉल करते हैं। यह मेथड कॉल हमें म्यूटेक्स लॉक से निर्मित ऑब्जेक्ट को अनलॉक करने की अनुमति देता है क्योंकि ऑब्जेक्ट की एक सिंगल थ्रेड तक पहुंच पहले प्रदान की गई थी और एक बार उस ऑब्जेक्ट पर ऑपरेशन एक बार में एक थ्रेड द्वारा किया जाता है। अब हम चाहते हैं कि अन्य थ्रेड्स भी उस ऑब्जेक्ट या कोड को एक्सेस करें। अन्यथा, हमारा कोड 'डेडलॉक' स्थिति में चलता है, जिसके कारण म्यूटेक्स के साथ बनाई गई वस्तु हमेशा के लिए बंद स्थिति में रहती है और कोई अन्य धागा उस ऑब्जेक्ट तक नहीं पहुंच पाएगा। इसलिए, एक अधूरा ऑपरेशन निष्पादित होता रहता है। इसके बाद, हम ब्लॉक फ़ंक्शन से बाहर निकलते हैं और मुख्य पर जाते हैं।

मुख्य में, हम केवल 'std :: थ्रेड थ्रेड_नाम (यहां पहले से बनाए गए ब्लॉक फ़ंक्शन को कॉल करते हुए जिसमें हमने म्यूटेक्स बनाया है)' का उपयोग करके तीन थ्रेड बनाकर हमारे बनाए गए म्यूटेक्स को थ्रेड 1, थ्रेड 2 और थ्रेड 3 आदि नामों के साथ प्रदर्शित करते हैं। इस तरह, तीन धागे बनाए जाते हैं। फिर हम इन तीन थ्रेड्स को 'thread_name. शामिल हों ()' विधि। और फिर, हम शून्य के बराबर मान लौटाते हैं। उदाहरण के पहले उल्लेखित स्पष्टीकरण को कोड के रूप में लागू किया गया है जिसे निम्न आकृति में दिखाया जा सकता है:

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

निष्कर्ष

यह मार्गदर्शिका C++ में प्रयुक्त म्यूटेक्स फ़ंक्शन की अवधारणा का विस्तृत विवरण देती है। हमने चर्चा की कि मल्टीथ्रेडिंग एप्लिकेशन क्या हैं, मल्टीथ्रेडिंग एप्लिकेशन में हमें किन समस्याओं का सामना करना पड़ता है, और हमें मल्टीथ्रेडिंग एप्लिकेशन के लिए म्यूटेक्स को लागू करने की आवश्यकता क्यों है। फिर हमने छद्म कोड का उपयोग करते हुए डमी उदाहरण के साथ म्यूटेक्स के सिंटैक्स पर चर्चा की। फिर, हमने सी ++ विजुअल स्टूडियो पर म्यूटेक्स के साथ मल्टीथ्रेडिंग अनुप्रयोगों पर एक पूर्ण उदाहरण लागू किया।