संसाधन अधिग्रहण आरंभीकरण: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 6: Line 6:
| last=Stroustrup
| last=Stroustrup
| date=2017-09-30
| date=2017-09-30
| access-date=2019-03-09}}</ref>  [[प्रोग्रामिंग मुहावरा|प्रोग्रामिंग विशिष्ट स्वरूप]] है<ref>{{cite book |last1=Sutter |first1=Herb |author-link1=Herb Sutter |last2=Alexandrescu |first2=Andrei |author-link2=Andrei Alexandrescu |year=2005 |title=C++ Coding Standards |url=https://archive.org/details/isbn_0321113586 |url-access=limited |series=C++ In-Depth Series |publisher=Addison-Wesley |page=[https://archive.org/details/isbn_0321113586/page/n54 24] |isbn=978-0-321-11358-0 }}</ref> विशेष भाषा के व्यवहार का वर्णन करने के लिए कई [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]], [[स्टेटिकली टाइप्ड प्रोग्रामिंग लैंग्वेज|स्टेटिकली टाइप्ड प्रोग्रामिंग भाषा]] में उपयोग किया जाता है। आरएआईआई (RAII) में, संसाधन धारण करना [[वर्ग अपरिवर्तनीय]] है, और [[वस्तु जीवनकाल]] से बना हुआ है। [[कंस्ट्रक्टर (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]] द्वारा ऑब्जेक्ट क्रिएशन (विशेष रूप से इनिशियलाइज़ेशन) के समय [[संसाधन आवंटन (कंप्यूटर)]] (या अधिग्रहण) किया जाता है, जबकि डिस्ट्रक्टर (कंप्यूटर) द्वारा वस्तु विकृति (विशेष रूप से फाइनलाइज़ेशन) के समय रिसोर्स डीलोकेशन (रिलीज़) किया जाता है। दूसरे शब्दों में, सफल होने के लिए आरंभीकरण के लिए संसाधन अधिग्रहण सफल होना चाहिए। इस प्रकार संसाधन को आरंभीकरण समाप्त होने और अंतिम रूप देने के मध्य आयोजित होने का आश्वासन दिया जाता हैI (संसाधनों को धारण करना वर्ग अपरिवर्तनीय है), और वस्तु के जीवित रहने पर ही आयोजित किया जाना है। इस प्रकार, यदि कोई वस्तु लीक नहीं होती है, तो कोई [[संसाधन रिसाव]] नहीं होता है।
| access-date=2019-03-09}}</ref>  [[प्रोग्रामिंग मुहावरा|प्रोग्रामिंग विशिष्ट स्वरूप]] है<ref>{{cite book |last1=Sutter |first1=Herb |author-link1=Herb Sutter |last2=Alexandrescu |first2=Andrei |author-link2=Andrei Alexandrescu |year=2005 |title=C++ Coding Standards |url=https://archive.org/details/isbn_0321113586 |url-access=limited |series=C++ In-Depth Series |publisher=Addison-Wesley |page=[https://archive.org/details/isbn_0321113586/page/n54 24] |isbn=978-0-321-11358-0 }}</ref> विशेष भाषा के व्यवहार का वर्णन करने के लिए कई [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]], [[स्टेटिकली टाइप्ड प्रोग्रामिंग लैंग्वेज|स्टेटिकली टाइप्ड प्रोग्रामिंग भाषा]] में उपयोग किया जाता है। आरएआईआई (RAII) में, संसाधन धारण करना [[वर्ग अपरिवर्तनीय]] है, एवं [[वस्तु जीवनकाल]] से बना हुआ है। [[कंस्ट्रक्टर (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]] द्वारा ऑब्जेक्ट क्रिएशन (विशेष रूप से इनिशियलाइज़ेशन) के समय [[संसाधन आवंटन (कंप्यूटर)]] (या अधिग्रहण) किया जाता है, जबकि डिस्ट्रक्टर (कंप्यूटर) द्वारा वस्तु विकृति (विशेष रूप से फाइनलाइज़ेशन) के समय रिसोर्स डीलोकेशन (रिलीज़) किया जाता है। दूसरे शब्दों में, सफल होने के लिए आरंभीकरण के लिए संसाधन अधिग्रहण सफल होना चाहिए। इस प्रकार संसाधन को आरंभीकरण समाप्त होने एवं अंतिम रूप देने के मध्य आयोजित होने का आश्वासन दिया जाता हैI (संसाधनों को धारण करना वर्ग अपरिवर्तनीय है), एवं वस्तु के जीवित रहने पर ही आयोजित किया जाना है। इस प्रकार, यदि कोई वस्तु लीक नहीं होती है, तो कोई [[संसाधन रिसाव]] नहीं होता है।


आरएआईआई सबसे प्रमुख रूप से [[सी ++]] के साथ जुड़ा हुआ है जहां इसकी उत्पत्ति हुई, लेकिन [[डी (प्रोग्रामिंग भाषा)]] भी है,<ref>{{cite web |title=Scope guards |url=https://tour.dlang.org/tour/en/gems/scope-guards |website=Dlang Tour |access-date=21 May 2021}}</ref> [[एडा (प्रोग्रामिंग भाषा)]],<ref>{{cite web |title=Gem #70: The Scope Locks Idiom |url=https://www.adacore.com/gems/gem-70 |website=AdaCore |access-date=21 May 2021 |language=en}}</ref> [[वाला (प्रोग्रामिंग लैंग्वेज)|वाला (प्रोग्रामिंगभाषा)]],<ref>{{cite web |author1=The Valadate Project |title=Destruction |url=https://naaando.gitbooks.io/the-vala-tutorial/content/en/4-object-oriented-programming/destruction.html |website=The Vala Tutorial version 0.30 |access-date=21 May 2021}}</ref> और [[जंग (प्रोग्रामिंग भाषा)]]।<ref>{{Cite web|title=RAII - Rust By Example|url=https://doc.rust-lang.org/rust-by-example/scope/raii.html|access-date=2020-11-22|website=doc.rust-lang.org}}</ref> सी ++ में [[अपवाद सुरक्षा]] | अपवाद-सुरक्षित [[संसाधन प्रबंधन (कंप्यूटिंग)]] के लिए तकनीक विकसित की गई थी{{sfn|Stroustrup|1994|loc=16.5 Resource Management, pp. 388–89}} 1984-89 के समय, मुख्य रूप से [[बज़्ने स्ट्रॉस्ट्रुप]] और [[एंड्रयू कोएनिग (प्रोग्रामर)]] द्वारा,{{sfn|Stroustrup|1994|loc=16.1 Exception Handling: Introduction, pp. 383–84}} और यह शब्द स्वयं स्ट्रॉस्ट्रुप द्वारा गढ़ा गया था।{{sfn|Stroustrup|1994|p=389|ps=. I called this technique "resource acquisition is initialization."}} आरएआईआई को आम तौर पर प्रारंभिकता के रूप में उच्चारित किया जाता है, कभी-कभी आर, , डबल आई के रूप में उच्चारित किया जाता है।<ref>{{cite web
आरएआईआई (RAII) सबसे प्रमुख रूप से [[सी ++|C ++]] के साथ जुड़ा हुआ है जहां इसकी उत्पत्ति हुई, लेकिन [[डी (प्रोग्रामिंग भाषा)|D (प्रोग्रामिंग भाषा)]] भी है,<ref>{{cite web |title=Scope guards |url=https://tour.dlang.org/tour/en/gems/scope-guards |website=Dlang Tour |access-date=21 May 2021}}</ref> [[एडा (प्रोग्रामिंग भाषा)]],<ref>{{cite web |title=Gem #70: The Scope Locks Idiom |url=https://www.adacore.com/gems/gem-70 |website=AdaCore |access-date=21 May 2021 |language=en}}</ref> [[वाला (प्रोग्रामिंग लैंग्वेज)|(प्रोग्रामिंगभाषा)]],<ref>{{cite web |author1=The Valadate Project |title=Destruction |url=https://naaando.gitbooks.io/the-vala-tutorial/content/en/4-object-oriented-programming/destruction.html |website=The Vala Tutorial version 0.30 |access-date=21 May 2021}}</ref> एवं [[जंग (प्रोग्रामिंग भाषा)|युद्ध (प्रोग्रामिंग भाषा)]]।<ref>{{Cite web|title=RAII - Rust By Example|url=https://doc.rust-lang.org/rust-by-example/scope/raii.html|access-date=2020-11-22|website=doc.rust-lang.org}}</ref> C ++ में [[अपवाद सुरक्षा]] [[संसाधन प्रबंधन (कंप्यूटिंग)]] के लिए प्रौद्योगिकी विकसित की गई थी{{sfn|Stroustrup|1994|loc=16.5 Resource Management, pp. 388–89}} 1984-89 के समय, मुख्य रूप से [[बज़्ने स्ट्रॉस्ट्रुप]] एवं [[एंड्रयू कोएनिग (प्रोग्रामर)]] द्वारा,{{sfn|Stroustrup|1994|loc=16.1 Exception Handling: Introduction, pp. 383–84}} एवं यह शब्द स्वयं स्ट्रॉस्ट्रुप द्वारा बनाया गया था।{{sfn|Stroustrup|1994|p=389|ps=. I called this technique "resource acquisition is initialization."}} आरएआईआई को सामान्यतः प्रारंभिकता के रूप में उच्चारित किया जाता है, कभी-कभी "R, A, डबल I" के रूप में उच्चारित किया जाता है।<ref>{{cite web
| url=https://stackoverflow.com/a/99986
| url=https://stackoverflow.com/a/99986
| title=How do you pronounce RAII?
| title=How do you pronounce RAII?
Line 14: Line 14:
| date=2008-09-19
| date=2008-09-19
| publisher=[[Stack Overflow]]
| publisher=[[Stack Overflow]]
| access-date=2019-03-09}}</ref>
| access-date=2019-03-09}}</ref> इस विशिष्ट स्वरूप के अन्य नामों में कंस्ट्रक्टर एक्वायर, डिस्ट्रक्टर रिलीज़ (CADRe) सम्मिलित हैं।<ref>{{Cite web
इस मुहावरे के अन्य नामों में कंस्ट्रक्टर एक  ्वायर, डिस्ट्रक्टर रिलीज़ (CADRe) शामिल हैं।<ref>{{Cite web
| url=https://groups.google.com/a/isocpp.org/d/msg/std-proposals/UnarLCzNPcI/epOagK6j-GAJ
| url=https://groups.google.com/a/isocpp.org/d/msg/std-proposals/UnarLCzNPcI/epOagK6j-GAJ
| title=Change official RAII to CADRe  
| title=Change official RAII to CADRe  
Line 22: Line 21:
| work=ISO C++ Standard - Future Proposals
| work=ISO C++ Standard - Future Proposals
| publisher=[[Google Groups]]
| publisher=[[Google Groups]]
| access-date=2019-03-09}}</ref> और उपयोग की एक  विशेष शैली को स्कोप-आधारित संसाधन प्रबंधन (एसबीआरएम) कहा जाता है।<ref>{{Cite web
| access-date=2019-03-09}}</ref> एवं उपयोग की विशेष शैली को स्कोप-आधारित संसाधन प्रबंधन (एसबीआरएम) कहा जाता है।<ref>{{Cite web
| url=http://allenchou.net/2014/10/scope-based-resource-management-raii/
| url=http://allenchou.net/2014/10/scope-based-resource-management-raii/
| title=Scope-Based Resource Management (RAII)
| title=Scope-Based Resource Management (RAII)
Line 28: Line 27:
| last=Chou
| last=Chou
| date=2014-10-01
| date=2014-10-01
| access-date=2019-03-09}}</ref> यह बाद वाला शब्द [[स्वचालित चर]] के विशेष मामले के लिए है। RAII संसाधनों को आजीवन वस्तु से जोड़ता है, जो एक  दायरे के प्रवेश और निकास के साथ मेल नहीं खा सकता है। (विशेष रूप से फ्री स्टोर पर आवंटित वेरिएबल्स का जीवनकाल किसी भी दायरे से असंबंधित होता है।) हालांकि, स्वचालित चर (SBRM) के लिए RAII का उपयोग करना सबसे आम उपयोग मामला है।
| access-date=2019-03-09}}</ref> यह शब्द [[स्वचालित चर|स्वचालित गतिमान]] की विशेष स्तिथि के लिए है। (RAII) आरएआईआई संसाधनों को आजीवन वस्तु से जोड़ता है, जो सीमा के प्रवेश एवं निकास के साथ मिल नहीं सकता है। (विशेष रूप से मुफ्त स्टोर पर आवंटित वेरिएबल्स का जीवनकाल किसी भी सीमा से असंबंधित होता है।) चूँकि, स्वचालित गतिमान (SBRM) के लिए आरएआईआई (RAII) को उपयोग करना सबसे सरल स्थिति हैI


== [[सी ++ 11]] उदाहरण ==
== [[सी ++ 11]] उदाहरण ==
निम्न C++11 उदाहरण फ़ाइल एक  ्सेस और म्यूटेक्स लॉकिंग के लिए RAII के उपयोग को प्रदर्शित करता है:
निम्न C++11 उदाहरण फ़ाइल एक  ्सेस एवं म्यूटेक्स लॉकिंग के लिए RAII के उपयोग को प्रदर्शित करता है:
<वाक्यविन्यास लैंग = सीपीपी>
<वाक्यविन्यास लैंग = सीपीपी>
#शामिल <fstream>
#सम्मिलित <fstream>
#शामिल <iostream>
#सम्मिलित <iostream>
#शामिल <म्यूटेक्स>
#सम्मिलित <म्यूटेक्स>
# शामिल करें
# सम्मिलित करें
#शामिल <स्ट्रिंग>
#सम्मिलित <स्ट्रिंग>


शून्य राइट टूफाइल (स्थिरांक एसटीडी :: स्ट्रिंग और संदेश) {
शून्य राइट टूफाइल (स्थिरांक एसटीडी :: स्ट्रिंग एवं संदेश) {
   // |म्यूटेक्स| फ़ाइल | तक पहुंच की रक्षा करना है (जो धागे भर में साझा किया जाता है)।
   // |म्यूटेक्स| फ़ाइल | तक पहुंच की रक्षा करना है (जो धागे भर में साझा किया जाता है)।
   स्थिर एसटीडी :: [[म्युटेक्स]] म्युटेक्स;
   स्थिर एसटीडी :: [[म्युटेक्स]] म्युटेक्स;
Line 61: Line 60:
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


यह कोड अपवाद-सुरक्षित है क्योंकि सी ++ गारंटी देता है कि सभी स्टैक ऑब्जेक्ट संलग्न दायरे के अंत में नष्ट हो जाते हैं, जिसे [[ढेर खोलना]] कहा जाता है। लॉक और फाइल ऑब्जेक्ट्स दोनों के विनाशकों को फ़ंक्शन से लौटने पर कॉल करने की गारंटी दी जाती है, चाहे कोई अपवाद फेंक दिया गया हो या नहीं।<ref>{{cite web
यह कोड अपवाद-सुरक्षित है क्योंकि सी ++ गारंटी देता है कि सभी स्टैक ऑब्जेक्ट संलग्न दायरे के अंत में नष्ट हो जाते हैं, जिसे [[ढेर खोलना]] कहा जाता है। लॉक एवं फाइल ऑब्जेक्ट्स दोनों के विनाशकों को फ़ंक्शन से लौटने पर कॉल करने की गारंटी दी जाती है, चाहे कोई अपवाद फेंक दिया गया हो या नहीं।<ref>{{cite web
| url=https://isocpp.org/wiki/faq/exceptions#dtors-shouldnt-throw
| url=https://isocpp.org/wiki/faq/exceptions#dtors-shouldnt-throw
| title=How can I handle a destructor that fails?
| title=How can I handle a destructor that fails?
| publisher=Standard C++ Foundation
| publisher=Standard C++ Foundation
| access-date=2019-03-09}}</ref>
| access-date=2019-03-09}}</ref>
स्थानीय चर एक  ही कार्य के भीतर कई संसाधनों के आसान प्रबंधन की अनुमति देते हैं: वे अपने निर्माण के विपरीत क्रम में नष्ट हो जाते हैं, और एक  वस्तु केवल पूरी तरह से निर्मित होने पर ही नष्ट हो जाती है - अर्थात, यदि इसके निर्माता से कोई अपवाद नहीं फैलता है।<ref>{{cite web
स्थानीय चर एक  ही कार्य के भीतर कई संसाधनों के आसान प्रबंधन की अनुमति देते हैं: वे अपने निर्माण के विपरीत क्रम में नष्ट हो जाते हैं, एवं एक  वस्तु केवल पूरी तरह से निर्मित होने पर ही नष्ट हो जाती है - अर्थात, यदि इसके निर्माता से कोई अपवाद नहीं फैलता है।<ref>{{cite web
| url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf
| url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf
| title=Working Draft, Standard for ProgrammingLanguage C++
| title=Working Draft, Standard for ProgrammingLanguage C++
Line 72: Line 71:
| author=Richard Smith
| author=Richard Smith
| access-date=2019-03-09}}</ref>
| access-date=2019-03-09}}</ref>
RAII का उपयोग संसाधन प्रबंधन को बहुत सरल करता है, समग्र कोड आकार को कम करता है और कार्यक्रम की शुद्धता सुनिश्चित करने में मदद करता है। RAII इसलिए उद्योग-मानक दिशानिर्देशों द्वारा अनुशंसित है,<ref>{{cite web
RAII का उपयोग संसाधन प्रबंधन को बहुत सरल करता है, समग्र कोड आकार को कम करता है एवं कार्यक्रम की शुद्धता सुनिश्चित करने में मदद करता है। RAII इसलिए उद्योग-मानक दिशानिर्देशों द्वारा अनुशंसित है,<ref>{{cite web
| url=https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
| url=https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
| title=C++ Core Guidelines
| title=C++ Core Guidelines
Line 83: Line 82:
| author-link2=Herb Sutter
| author-link2=Herb Sutter
| access-date=2020-08-15}}</ref>
| access-date=2020-08-15}}</ref>
और अधिकांश सी ++ मानक पुस्तकालय मुहावरे का पालन करते हैं।<ref>{{cite web
एवं अधिकांश सी ++ मानक पुस्तकालय मुहावरे का पालन करते हैं।<ref>{{cite web
| url=https://isocpp.org/wiki/faq/exceptions#too-many-trycatch-blocks
| url=https://isocpp.org/wiki/faq/exceptions#too-many-trycatch-blocks
| title=I have too many try blocks; what can I do about it?
| title=I have too many try blocks; what can I do about it?
Line 91: Line 90:


== लाभ ==
== लाभ ==
संसाधन प्रबंधन तकनीक के रूप में RAII के लाभ यह हैं कि यह इनकैप्सुलेशन, अपवाद सुरक्षा (स्टैक संसाधनों के लिए), और स्थानीयता प्रदान करता है (यह अधिग्रहण और रिलीज़ लॉजिक को एक  दूसरे के बगल में लिखने की अनुमति देता है)।
संसाधन प्रबंधन तकनीक के रूप में RAII के लाभ यह हैं कि यह इनकैप्सुलेशन, अपवाद सुरक्षा (स्टैक संसाधनों के लिए), एवं स्थानीयता प्रदान करता है (यह अधिग्रहण एवं रिलीज़ लॉजिक को एक  दूसरे के बगल में लिखने की अनुमति देता है)।


एनकैप्सुलेशन प्रदान किया जाता है क्योंकि संसाधन प्रबंधन तर्क को कक्षा में एक  बार परिभाषित किया जाता है, प्रत्येक कॉल साइट पर नहीं। स्टैक संसाधनों के लिए अपवाद सुरक्षा प्रदान की जाती है (संसाधन जो उसी दायरे में जारी किए जाते हैं जैसे वे अधिग्रहित होते हैं) संसाधन को स्टैक वैरिएबल (किसी दिए गए दायरे में घोषित एक  स्थानीय चर) के जीवनकाल में बांधकर: यदि कोई अपवाद हैंडलिंग फेंक दी जाती है, और उचित अपवाद हैंडलिंग मौजूद है, वर्तमान [[स्कोप (कंप्यूटर साइंस)]] से बाहर निकलने पर निष्पादित किया जाने वाला एक  मात्र कोड उस दायरे में घोषित वस्तुओं के विनाशक हैं। अंत में, परिभाषा का स्थान वर्ग परिभाषा में एक  दूसरे के बगल में कंस्ट्रक्टर और डिस्ट्रक्टर परिभाषाओं को लिखकर प्रदान किया जाता है।
एनकैप्सुलेशन प्रदान किया जाता है क्योंकि संसाधन प्रबंधन तर्क को कक्षा में एक  बार परिभाषित किया जाता है, प्रत्येक कॉल साइट पर नहीं। स्टैक संसाधनों के लिए अपवाद सुरक्षा प्रदान की जाती है (संसाधन जो उसी दायरे में जारी किए जाते हैं जैसे वे अधिग्रहित होते हैं) संसाधन को स्टैक वैरिएबल (किसी दिए गए दायरे में घोषित एक  स्थानीय चर) के जीवनकाल में बांधकर: यदि कोई अपवाद हैंडलिंग फेंक दी जाती है, एवं उचित अपवाद हैंडलिंग मौजूद है, वर्तमान [[स्कोप (कंप्यूटर साइंस)]] से बाहर निकलने पर निष्पादित किया जाने वाला एक  मात्र कोड उस दायरे में घोषित वस्तुओं के विनाशक हैं। अंत में, परिभाषा का स्थान वर्ग परिभाषा में एक  दूसरे के बगल में कंस्ट्रक्टर एवं डिस्ट्रक्टर परिभाषाओं को लिखकर प्रदान किया जाता है।


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


आरएआईआई की तुलना <code>finally</code> जावा में प्रयुक्त निर्माण, स्ट्रॉस्ट्रुप ने लिखा है कि "यथार्थवादी प्रणालियों में, संसाधनों के प्रकारों की तुलना में कहीं अधिक संसाधन अधिग्रहण होते हैं, इसलिए 'संसाधन अधिग्रहण आरंभीकरण है' तकनीक 'आखिरकार' निर्माण के उपयोग की तुलना में कम कोड की ओर ले जाती है।"<ref name="faq"/>
आरएआईआई की तुलना <code>finally</code> जावा में प्रयुक्त निर्माण, स्ट्रॉस्ट्रुप ने लिखा है कि "यथार्थवादी प्रणालियों में, संसाधनों के प्रकारों की तुलना में कहीं अधिक संसाधन अधिग्रहण होते हैं, इसलिए 'संसाधन अधिग्रहण आरंभीकरण है' तकनीक 'आखिरकार' निर्माण के उपयोग की तुलना में कम कोड की ओर ले जाती है।"<ref name="faq"/>
Line 102: Line 101:
== विशिष्ट उपयोग ==
== विशिष्ट उपयोग ==


RAII डिज़ाइन का उपयोग अक्सर थ्रेड (कंप्यूटिंग)#मल्टीथ्रेडिंग|मल्टी-थ्रेडेड अनुप्रयोगों में म्यूटेक्स लॉक को नियंत्रित करने के लिए किया जाता है। उस उपयोग में, ऑब्जेक्ट नष्ट होने पर लॉक को रिलीज़ करता है। इस परिदृश्य में RAII के बिना [[गतिरोध]] की संभावना अधिक होगी और म्यूटेक्स को लॉक करने का तर्क इसे अनलॉक करने के तर्क से बहुत दूर होगा। आरएआईआई के साथ, म्यूटेक्स को लॉक करने वाले कोड में अनिवार्य रूप से तर्क शामिल है कि निष्पादन आरएआईआई ऑब्जेक्ट के दायरे को छोड़ने पर लॉक जारी किया जाएगा।
RAII डिज़ाइन का उपयोग अक्सर थ्रेड (कंप्यूटिंग)#मल्टीथ्रेडिंग|मल्टी-थ्रेडेड अनुप्रयोगों में म्यूटेक्स लॉक को नियंत्रित करने के लिए किया जाता है। उस उपयोग में, ऑब्जेक्ट नष्ट होने पर लॉक को रिलीज़ करता है। इस परिदृश्य में RAII के बिना [[गतिरोध]] की संभावना अधिक होगी एवं म्यूटेक्स को लॉक करने का तर्क इसे अनलॉक करने के तर्क से बहुत दूर होगा। आरएआईआई के साथ, म्यूटेक्स को लॉक करने वाले कोड में अनिवार्य रूप से तर्क सम्मिलित है कि निष्पादन आरएआईआई ऑब्जेक्ट के दायरे को छोड़ने पर लॉक जारी किया जाएगा।


एक  अन्य विशिष्ट उदाहरण फाइलों के साथ बातचीत कर रहा है: हमारे पास एक  वस्तु हो सकती है जो एक  फ़ाइल का प्रतिनिधित्व करती है जो लिखने के लिए खुली है, जिसमें फ़ाइल को कंस्ट्रक्टर में खोला जाता है और जब निष्पादन वस्तु के दायरे को छोड़ देता है तो बंद हो जाता है। दोनों ही मामलों में, RAII केवल यह सुनिश्चित करता है कि विचाराधीन संसाधन उचित रूप से जारी किया जाए; अपवाद सुरक्षा बनाए रखने के लिए अभी भी देखभाल की जानी चाहिए। यदि डेटा संरचना या फ़ाइल को संशोधित करने वाला कोड अपवाद-सुरक्षित नहीं है, तो म्यूटेक्स को अनलॉक किया जा सकता है या फ़ाइल को डेटा संरचना के साथ बंद किया जा सकता है या फ़ाइल दूषित हो सकती है।
एक  अन्य विशिष्ट उदाहरण फाइलों के साथ बातचीत कर रहा है: हमारे पास एक  वस्तु हो सकती है जो एक  फ़ाइल का प्रतिनिधित्व करती है जो लिखने के लिए खुली है, जिसमें फ़ाइल को कंस्ट्रक्टर में खोला जाता है एवं जब निष्पादन वस्तु के दायरे को छोड़ देता है तो बंद हो जाता है। दोनों ही मामलों में, RAII केवल यह सुनिश्चित करता है कि विचाराधीन संसाधन उचित रूप से जारी किया जाए; अपवाद सुरक्षा बनाए रखने के लिए अभी भी देखभाल की जानी चाहिए। यदि डेटा संरचना या फ़ाइल को संशोधित करने वाला कोड अपवाद-सुरक्षित नहीं है, तो म्यूटेक्स को अनलॉक किया जा सकता है या फ़ाइल को डेटा संरचना के साथ बंद किया जा सकता है या फ़ाइल दूषित हो सकती है।


गतिशील रूप से आवंटित वस्तुओं का स्वामित्व (आवंटित स्मृति <code>new</code> सी ++ में) को आरएआईआई के साथ भी नियंत्रित किया जा सकता है, जैसे कि आरएआईआई (स्टैक-आधारित) ऑब्जेक्ट नष्ट होने पर ऑब्जेक्ट जारी किया जाता है। इस प्रयोजन के लिए, C++11 मानक पुस्तकालय [[स्मार्ट सूचक]] वर्गों को परिभाषित करता है <code>[[Smart pointer#unique_ptr|std::unique_ptr]]</code> एक  ल-स्वामित्व वाली वस्तुओं के लिए और <code>[[Smart_pointer#shared_ptr_and_weak_ptr|std::shared_ptr]]</code> साझा स्वामित्व वाली वस्तुओं के लिए। इसी तरह की कक्षाएं भी उपलब्ध हैं <code>[[auto ptr|std::auto_ptr]]</code> सी ++ 98 में, और <code>boost::shared_ptr</code> [[बूस्ट (सी ++ पुस्तकालय)]] में।
गतिशील रूप से आवंटित वस्तुओं का स्वामित्व (आवंटित स्मृति <code>new</code> सी ++ में) को आरएआईआई के साथ भी नियंत्रित किया जा सकता है, जैसे कि आरएआईआई (स्टैक-आधारित) ऑब्जेक्ट नष्ट होने पर ऑब्जेक्ट जारी किया जाता है। इस प्रयोजन के लिए, C++11 मानक पुस्तकालय [[स्मार्ट सूचक]] वर्गों को परिभाषित करता है <code>[[Smart pointer#unique_ptr|std::unique_ptr]]</code> एक  ल-स्वामित्व वाली वस्तुओं के लिए एवं <code>[[Smart_pointer#shared_ptr_and_weak_ptr|std::shared_ptr]]</code> साझा स्वामित्व वाली वस्तुओं के लिए। इसी तरह की कक्षाएं भी उपलब्ध हैं <code>[[auto ptr|std::auto_ptr]]</code> सी ++ 98 में, एवं <code>boost::shared_ptr</code> [[बूस्ट (सी ++ पुस्तकालय)]] में।


== कंपाइलर क्लीनअप एक  ्सटेंशन ==
== कंपाइलर क्लीनअप एक  ्सटेंशन ==
[[बजना]] और जीएनयू कंपाइलर संग्रह दोनों आरएआईआई का समर्थन करने के लिए [[सी (प्रोग्रामिंग भाषा)]] भाषा के लिए एक  गैर-मानक एक  ्सटेंशन लागू करते हैं: क्लीनअप वेरिएबल विशेषता।<ref>{{Cite web
[[बजना]] एवं जीएनयू कंपाइलर संग्रह दोनों आरएआईआई का समर्थन करने के लिए [[सी (प्रोग्रामिंग भाषा)]] भाषा के लिए एक  गैर-मानक एक  ्सटेंशन लागू करते हैं: क्लीनअप वेरिएबल विशेषता।<ref>{{Cite web
| url=https://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html
| url=https://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html
| title=Specifying Attributes of Variables
| title=Specifying Attributes of Variables
Line 125: Line 124:


== सीमाएं ==
== सीमाएं ==
आरएआईआई केवल स्टैक-आवंटित वस्तुओं द्वारा अधिग्रहित और जारी (प्रत्यक्ष या अप्रत्यक्ष रूप से) संसाधनों के लिए काम करता है,
आरएआईआई केवल स्टैक-आवंटित वस्तुओं द्वारा अधिग्रहित एवं जारी (प्रत्यक्ष या अप्रत्यक्ष रूप से) संसाधनों के लिए काम करता है,
जहां एक  अच्छी तरह से परिभाषित स्थिर वस्तु जीवनकाल है।
जहां एक  अच्छी तरह से परिभाषित स्थिर वस्तु जीवनकाल है।
हीप-आबंटित वस्तुएँ जो स्वयं संसाधनों को प्राप्त और जारी करती हैं, C++ सहित कई भाषाओं में आम हैं। आरएआईआई अपने संसाधन-विमोचन विनाशक (या समतुल्य) को ट्रिगर करने के लिए ढेर-आधारित वस्तुओं पर निर्भर करता है ताकि सभी संभावित निष्पादन पथों के साथ स्पष्ट रूप से या स्पष्ट रूप से हटाया जा सके।<ref>{{cite news
हीप-आबंटित वस्तुएँ जो स्वयं संसाधनों को प्राप्त एवं जारी करती हैं, C++ सहित कई भाषाओं में आम हैं। आरएआईआई अपने संसाधन-विमोचन विनाशक (या समतुल्य) को ट्रिगर करने के लिए ढेर-आधारित वस्तुओं पर निर्भर करता है ताकि सभी संभावित निष्पादन पथों के साथ स्पष्ट रूप से या स्पष्ट रूप से हटाया जा सके।<ref>{{cite news
| title=Exceptional Situations and Program Reliability
| title=Exceptional Situations and Program Reliability
| first1=Westley
| first1=Westley
Line 145: Line 144:
| date=2011-04-05
| date=2011-04-05
| publisher=Stack Overflow
| publisher=Stack Overflow
| access-date=2019-03-09}}</ref> यह व्यवहार आम तौर पर स्वीकार्य है, क्योंकि ऑपरेटिंग सिस्टम प्रोग्राम समाप्ति पर शेष संसाधन जैसे स्मृति, फ़ाइलें, सॉकेट इत्यादि जारी करता है।{{citation needed|date=January 2020}}
| access-date=2019-03-09}}</ref> यह व्यवहारसामान्यतः स्वीकार्य है, क्योंकि ऑपरेटिंग सिस्टम प्रोग्राम समाप्ति पर शेष संसाधन जैसे स्मृति, फ़ाइलें, सॉकेट इत्यादि जारी करता है।{{citation needed|date=January 2020}}




Line 154: Line 153:
| work=Extending and Embedding the Python Interpreter
| work=Extending and Embedding the Python Interpreter
| publisher=[[Python Software Foundation]]
| publisher=[[Python Software Foundation]]
| access-date=2019-03-09}}</ref> और [[पीएचपी]]<ref>{{Cite web
| access-date=2019-03-09}}</ref> एवं [[पीएचपी]]<ref>{{Cite web
| url=https://stackoverflow.com/a/4938780
| url=https://stackoverflow.com/a/4938780
| title=Does PHP support the RAII pattern? How?
| title=Does PHP support the RAII pattern? How?
| author=hobbs
| author=hobbs
| date=2011-02-08
| date=2011-02-08
| access-date=2019-03-09}}</ref> संदर्भ गणना द्वारा वस्तु जीवनकाल का प्रबंधन करें, जिससे RAII का उपयोग करना संभव हो जाता है। जिन वस्तुओं को अब संदर्भित नहीं किया जाता है उन्हें तुरंत नष्ट कर दिया जाता है या अंतिम रूप दिया जाता है और जारी किया जाता है, इसलिए एक  विध्वंसक या [[finalizer]] उस समय संसाधन जारी कर सकता है। हालांकि, यह हमेशा ऐसी भाषाओं में मुहावरेदार नहीं होता है, और विशेष रूप से पायथन में निराश होता है ([[संदर्भ प्रबंधक]]ों के पक्ष में और कमजोर पैकेज से अंतिम रूप देने वालों के पक्ष में)।{{fact|date=June 2022}}
| access-date=2019-03-09}}</ref> संदर्भ गणना द्वारा वस्तु जीवनकाल का प्रबंधन करें, जिससे RAII का उपयोग करना संभव हो जाता है। जिन वस्तुओं को अब संदर्भित नहीं किया जाता है उन्हें तुरंत नष्ट कर दिया जाता है या अंतिम रूप दिया जाता है एवं जारी किया जाता है, इसलिए एक  विध्वंसक या [[finalizer]] उस समय संसाधन जारी कर सकता है। हालांकि, यह हमेशा ऐसी भाषाओं में मुहावरेदार नहीं होता है, एवं विशेष रूप से पायथन में निराश होता है ([[संदर्भ प्रबंधक]]ों के पक्ष में एवं कमजोर पैकेज से अंतिम रूप देने वालों के पक्ष में)।{{fact|date=June 2022}}
हालाँकि, वस्तु जीवन काल अनिवार्य रूप से किसी भी दायरे से बंधे नहीं हैं, और वस्तुओं को गैर-नियतात्मक रूप से नष्ट किया जा सकता है या बिल्कुल भी नहीं। यह गलती से उन संसाधनों को लीक करना संभव बनाता है जिन्हें किसी दायरे के अंत में जारी किया जाना चाहिए था। एक  स्थिर चर (विशेष रूप से एक  [[वैश्विक चर]]) में संग्रहीत वस्तुओं को कार्यक्रम के समाप्त होने पर अंतिम रूप नहीं दिया जा सकता है, इसलिए उनके संसाधन जारी नहीं किए जाते हैं; उदाहरण के लिए, सीपीथॉन ऐसी वस्तुओं को अंतिम रूप देने की कोई गारंटी नहीं देता है। इसके अलावा, परिपत्र संदर्भ वाली वस्तुएं एक  साधारण संदर्भ काउंटर द्वारा एक  त्र नहीं की जाएंगी, और अनिश्चित रूप से लंबे समय तक जीवित रहेंगी; भले ही एक  त्र किया गया हो (अधिक परिष्कृत कचरा संग्रह द्वारा), विनाश का समय और विनाश का क्रम गैर-नियतात्मक होगा। CPython में एक  साइकिल डिटेक्टर है जो चक्रों का पता लगाता है और चक्र में वस्तुओं को अंतिम रूप देता है, हालांकि CPython 3.4 से पहले, चक्रों को एक  त्र नहीं किया जाता है यदि चक्र में किसी भी वस्तु को अंतिम रूप दिया जाता है।<ref>{{cite web
हालाँकि, वस्तु जीवन काल अनिवार्य रूप से किसी भी दायरे से बंधे नहीं हैं, एवं वस्तुओं को गैर-नियतात्मक रूप से नष्ट किया जा सकता है या बिल्कुल भी नहीं। यह गलती से उन संसाधनों को लीक करना संभव बनाता है जिन्हें किसी दायरे के अंत में जारी किया जाना चाहिए था। एक  स्थिर चर (विशेष रूप से एक  [[वैश्विक चर]]) में संग्रहीत वस्तुओं को कार्यक्रम के समाप्त होने पर अंतिम रूप नहीं दिया जा सकता है, इसलिए उनके संसाधन जारी नहीं किए जाते हैं; उदाहरण के लिए, सीपीथॉन ऐसी वस्तुओं को अंतिम रूप देने की कोई गारंटी नहीं देता है। इसके अलावा, परिपत्र संदर्भ वाली वस्तुएं एक  साधारण संदर्भ काउंटर द्वारा एक  त्र नहीं की जाएंगी, एवं अनिश्चित रूप से लंबे समय तक जीवित रहेंगी; भले ही एक  त्र किया गया हो (अधिक परिष्कृत कचरा संग्रह द्वारा), विनाश का समय एवं विनाश का क्रम गैर-नियतात्मक होगा। CPython में एक  साइकिल डिटेक्टर है जो चक्रों का पता लगाता है एवं चक्र में वस्तुओं को अंतिम रूप देता है, हालांकि CPython 3.4 से पहले, चक्रों को एक  त्र नहीं किया जाता है यदि चक्र में किसी भी वस्तु को अंतिम रूप दिया जाता है।<ref>{{cite web
| url=https://docs.python.org/3/library/gc.html
| url=https://docs.python.org/3/library/gc.html
| title=gc — Garbage Collector interface
| title=gc — Garbage Collector interface

Revision as of 14:32, 26 February 2023

संसाधन अधिग्रहण आरंभीकरण है आरएआईआई (RAII)[1] प्रोग्रामिंग विशिष्ट स्वरूप है[2] विशेष भाषा के व्यवहार का वर्णन करने के लिए कई ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग, स्टेटिकली टाइप्ड प्रोग्रामिंग भाषा में उपयोग किया जाता है। आरएआईआई (RAII) में, संसाधन धारण करना वर्ग अपरिवर्तनीय है, एवं वस्तु जीवनकाल से बना हुआ है। कंस्ट्रक्टर (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) द्वारा ऑब्जेक्ट क्रिएशन (विशेष रूप से इनिशियलाइज़ेशन) के समय संसाधन आवंटन (कंप्यूटर) (या अधिग्रहण) किया जाता है, जबकि डिस्ट्रक्टर (कंप्यूटर) द्वारा वस्तु विकृति (विशेष रूप से फाइनलाइज़ेशन) के समय रिसोर्स डीलोकेशन (रिलीज़) किया जाता है। दूसरे शब्दों में, सफल होने के लिए आरंभीकरण के लिए संसाधन अधिग्रहण सफल होना चाहिए। इस प्रकार संसाधन को आरंभीकरण समाप्त होने एवं अंतिम रूप देने के मध्य आयोजित होने का आश्वासन दिया जाता हैI (संसाधनों को धारण करना वर्ग अपरिवर्तनीय है), एवं वस्तु के जीवित रहने पर ही आयोजित किया जाना है। इस प्रकार, यदि कोई वस्तु लीक नहीं होती है, तो कोई संसाधन रिसाव नहीं होता है।

आरएआईआई (RAII) सबसे प्रमुख रूप से C ++ के साथ जुड़ा हुआ है जहां इसकी उत्पत्ति हुई, लेकिन D (प्रोग्रामिंग भाषा) भी है,[3] एडा (प्रोग्रामिंग भाषा),[4] (प्रोग्रामिंगभाषा),[5] एवं युद्ध (प्रोग्रामिंग भाषा)[6] C ++ में अपवाद सुरक्षा संसाधन प्रबंधन (कंप्यूटिंग) के लिए प्रौद्योगिकी विकसित की गई थी[7] 1984-89 के समय, मुख्य रूप से बज़्ने स्ट्रॉस्ट्रुप एवं एंड्रयू कोएनिग (प्रोग्रामर) द्वारा,[8] एवं यह शब्द स्वयं स्ट्रॉस्ट्रुप द्वारा बनाया गया था।[9] आरएआईआई को सामान्यतः प्रारंभिकता के रूप में उच्चारित किया जाता है, कभी-कभी "R, A, डबल I" के रूप में उच्चारित किया जाता है।[10] इस विशिष्ट स्वरूप के अन्य नामों में कंस्ट्रक्टर एक्वायर, डिस्ट्रक्टर रिलीज़ (CADRe) सम्मिलित हैं।[11] एवं उपयोग की विशेष शैली को स्कोप-आधारित संसाधन प्रबंधन (एसबीआरएम) कहा जाता है।[12] यह शब्द स्वचालित गतिमान की विशेष स्तिथि के लिए है। (RAII) आरएआईआई संसाधनों को आजीवन वस्तु से जोड़ता है, जो सीमा के प्रवेश एवं निकास के साथ मिल नहीं सकता है। (विशेष रूप से मुफ्त स्टोर पर आवंटित वेरिएबल्स का जीवनकाल किसी भी सीमा से असंबंधित होता है।) चूँकि, स्वचालित गतिमान (SBRM) के लिए आरएआईआई (RAII) को उपयोग करना सबसे सरल स्थिति हैI

सी ++ 11 उदाहरण

निम्न C++11 उदाहरण फ़ाइल एक ्सेस एवं म्यूटेक्स लॉकिंग के लिए RAII के उपयोग को प्रदर्शित करता है: <वाक्यविन्यास लैंग = सीपीपी>

  1. सम्मिलित <fstream>
  2. सम्मिलित <iostream>
  3. सम्मिलित <म्यूटेक्स>
  4. सम्मिलित करें
  5. सम्मिलित <स्ट्रिंग>

शून्य राइट टूफाइल (स्थिरांक एसटीडी :: स्ट्रिंग एवं संदेश) {

 // |म्यूटेक्स| फ़ाइल | तक पहुंच की रक्षा करना है (जो धागे भर में साझा किया जाता है)।
 स्थिर एसटीडी :: म्युटेक्स म्युटेक्स;
 // लॉक | म्यूटेक्स | |फ़ाइल|तक पहुँचने से पहले।
 एसटीडी :: लॉक_गार्ड <एसटीडी :: म्यूटेक्स> लॉक (म्यूटेक्स);
 // फ़ाइल खोलने का प्रयास करें।
 एसटीडी :: ऑफस्ट्रीम फ़ाइल (example.txt);
 अगर (! फ़ाइल is_open ()) {
   फेंक std::runtime_error (फ़ाइल खोलने में असमर्थ);
 }
 //लिखें |संदेश| से |फ़ाइल|.
 फ़ाइल << संदेश << एसटीडी :: endl;
 // |फ़ाइल| गुंजाइश छोड़ते समय पहले बंद हो जाएगा (अपवाद की परवाह किए बिना)
 // |म्यूटेक्स| स्कोप छोड़ते समय दूसरा (लॉक | डिस्ट्रक्टर से) अनलॉक किया जाएगा
 // (अपवाद की परवाह किए बिना)।

} </वाक्यविन्यास हाइलाइट>

यह कोड अपवाद-सुरक्षित है क्योंकि सी ++ गारंटी देता है कि सभी स्टैक ऑब्जेक्ट संलग्न दायरे के अंत में नष्ट हो जाते हैं, जिसे ढेर खोलना कहा जाता है। लॉक एवं फाइल ऑब्जेक्ट्स दोनों के विनाशकों को फ़ंक्शन से लौटने पर कॉल करने की गारंटी दी जाती है, चाहे कोई अपवाद फेंक दिया गया हो या नहीं।[13] स्थानीय चर एक ही कार्य के भीतर कई संसाधनों के आसान प्रबंधन की अनुमति देते हैं: वे अपने निर्माण के विपरीत क्रम में नष्ट हो जाते हैं, एवं एक वस्तु केवल पूरी तरह से निर्मित होने पर ही नष्ट हो जाती है - अर्थात, यदि इसके निर्माता से कोई अपवाद नहीं फैलता है।[14] RAII का उपयोग संसाधन प्रबंधन को बहुत सरल करता है, समग्र कोड आकार को कम करता है एवं कार्यक्रम की शुद्धता सुनिश्चित करने में मदद करता है। RAII इसलिए उद्योग-मानक दिशानिर्देशों द्वारा अनुशंसित है,[15] एवं अधिकांश सी ++ मानक पुस्तकालय मुहावरे का पालन करते हैं।[16]


लाभ

संसाधन प्रबंधन तकनीक के रूप में RAII के लाभ यह हैं कि यह इनकैप्सुलेशन, अपवाद सुरक्षा (स्टैक संसाधनों के लिए), एवं स्थानीयता प्रदान करता है (यह अधिग्रहण एवं रिलीज़ लॉजिक को एक दूसरे के बगल में लिखने की अनुमति देता है)।

एनकैप्सुलेशन प्रदान किया जाता है क्योंकि संसाधन प्रबंधन तर्क को कक्षा में एक बार परिभाषित किया जाता है, प्रत्येक कॉल साइट पर नहीं। स्टैक संसाधनों के लिए अपवाद सुरक्षा प्रदान की जाती है (संसाधन जो उसी दायरे में जारी किए जाते हैं जैसे वे अधिग्रहित होते हैं) संसाधन को स्टैक वैरिएबल (किसी दिए गए दायरे में घोषित एक स्थानीय चर) के जीवनकाल में बांधकर: यदि कोई अपवाद हैंडलिंग फेंक दी जाती है, एवं उचित अपवाद हैंडलिंग मौजूद है, वर्तमान स्कोप (कंप्यूटर साइंस) से बाहर निकलने पर निष्पादित किया जाने वाला एक मात्र कोड उस दायरे में घोषित वस्तुओं के विनाशक हैं। अंत में, परिभाषा का स्थान वर्ग परिभाषा में एक दूसरे के बगल में कंस्ट्रक्टर एवं डिस्ट्रक्टर परिभाषाओं को लिखकर प्रदान किया जाता है।

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

आरएआईआई की तुलना finally जावा में प्रयुक्त निर्माण, स्ट्रॉस्ट्रुप ने लिखा है कि "यथार्थवादी प्रणालियों में, संसाधनों के प्रकारों की तुलना में कहीं अधिक संसाधन अधिग्रहण होते हैं, इसलिए 'संसाधन अधिग्रहण आरंभीकरण है' तकनीक 'आखिरकार' निर्माण के उपयोग की तुलना में कम कोड की ओर ले जाती है।"[1]


विशिष्ट उपयोग

RAII डिज़ाइन का उपयोग अक्सर थ्रेड (कंप्यूटिंग)#मल्टीथ्रेडिंग|मल्टी-थ्रेडेड अनुप्रयोगों में म्यूटेक्स लॉक को नियंत्रित करने के लिए किया जाता है। उस उपयोग में, ऑब्जेक्ट नष्ट होने पर लॉक को रिलीज़ करता है। इस परिदृश्य में RAII के बिना गतिरोध की संभावना अधिक होगी एवं म्यूटेक्स को लॉक करने का तर्क इसे अनलॉक करने के तर्क से बहुत दूर होगा। आरएआईआई के साथ, म्यूटेक्स को लॉक करने वाले कोड में अनिवार्य रूप से तर्क सम्मिलित है कि निष्पादन आरएआईआई ऑब्जेक्ट के दायरे को छोड़ने पर लॉक जारी किया जाएगा।

एक अन्य विशिष्ट उदाहरण फाइलों के साथ बातचीत कर रहा है: हमारे पास एक वस्तु हो सकती है जो एक फ़ाइल का प्रतिनिधित्व करती है जो लिखने के लिए खुली है, जिसमें फ़ाइल को कंस्ट्रक्टर में खोला जाता है एवं जब निष्पादन वस्तु के दायरे को छोड़ देता है तो बंद हो जाता है। दोनों ही मामलों में, RAII केवल यह सुनिश्चित करता है कि विचाराधीन संसाधन उचित रूप से जारी किया जाए; अपवाद सुरक्षा बनाए रखने के लिए अभी भी देखभाल की जानी चाहिए। यदि डेटा संरचना या फ़ाइल को संशोधित करने वाला कोड अपवाद-सुरक्षित नहीं है, तो म्यूटेक्स को अनलॉक किया जा सकता है या फ़ाइल को डेटा संरचना के साथ बंद किया जा सकता है या फ़ाइल दूषित हो सकती है।

गतिशील रूप से आवंटित वस्तुओं का स्वामित्व (आवंटित स्मृति new सी ++ में) को आरएआईआई के साथ भी नियंत्रित किया जा सकता है, जैसे कि आरएआईआई (स्टैक-आधारित) ऑब्जेक्ट नष्ट होने पर ऑब्जेक्ट जारी किया जाता है। इस प्रयोजन के लिए, C++11 मानक पुस्तकालय स्मार्ट सूचक वर्गों को परिभाषित करता है std::unique_ptr एक ल-स्वामित्व वाली वस्तुओं के लिए एवं std::shared_ptr साझा स्वामित्व वाली वस्तुओं के लिए। इसी तरह की कक्षाएं भी उपलब्ध हैं std::auto_ptr सी ++ 98 में, एवं boost::shared_ptr बूस्ट (सी ++ पुस्तकालय) में।

कंपाइलर क्लीनअप एक ्सटेंशन

बजना एवं जीएनयू कंपाइलर संग्रह दोनों आरएआईआई का समर्थन करने के लिए सी (प्रोग्रामिंग भाषा) भाषा के लिए एक गैर-मानक एक ्सटेंशन लागू करते हैं: क्लीनअप वेरिएबल विशेषता।[17] निम्नलिखित एक दिए गए विनाशक फ़ंक्शन के साथ एक वैरिएबल को एनोटेट करता है जिसे वेरिएबल दायरे से बाहर होने पर कॉल करेगा:

<वाक्यविन्यास प्रकाश लैंग = सी> शून्य उदाहरण_उपयोग () {

 __attribute__((क्लीनअप(fclosep))) फ़ाइल *logfile = fopen(logfile.txt, w+);
 fputs (हैलो लॉगफाइल!, लॉगफाइल);

} </वाक्यविन्यास हाइलाइट> इस उदाहरण में, कंपाइलर fclosep फ़ंक्शन को example_usage रिटर्न से पहले लॉगफ़ाइल पर कॉल करने की व्यवस्था करता है।

सीमाएं

आरएआईआई केवल स्टैक-आवंटित वस्तुओं द्वारा अधिग्रहित एवं जारी (प्रत्यक्ष या अप्रत्यक्ष रूप से) संसाधनों के लिए काम करता है, जहां एक अच्छी तरह से परिभाषित स्थिर वस्तु जीवनकाल है। हीप-आबंटित वस्तुएँ जो स्वयं संसाधनों को प्राप्त एवं जारी करती हैं, C++ सहित कई भाषाओं में आम हैं। आरएआईआई अपने संसाधन-विमोचन विनाशक (या समतुल्य) को ट्रिगर करने के लिए ढेर-आधारित वस्तुओं पर निर्भर करता है ताकि सभी संभावित निष्पादन पथों के साथ स्पष्ट रूप से या स्पष्ट रूप से हटाया जा सके।[18]: 8:27  चक्रीय रूप से संदर्भित वस्तुओं के लिए कमजोर पॉइंटर्स के साथ, सभी हीप ऑब्जेक्ट्स को प्रबंधित करने के लिए स्मार्ट पॉइंटर्स का उपयोग करके इसे प्राप्त किया जा सकता है।

सी ++ में, स्टैक अनइंडिंग केवल तभी होने की गारंटी है जब अपवाद कहीं पकड़ा जाता है। ऐसा इसलिए है क्योंकि यदि किसी प्रोग्राम में कोई मिलान करने वाला हैंडलर नहीं मिलता है, तो फ़ंक्शन टर्मिनेट () कहा जाता है; इस कॉल को समाप्त करने से पहले स्टैक अवांछित है या नहीं () कार्यान्वयन-परिभाषित (15.5.1) है। (सी++03 मानक, §15.3/9)।[19] यह व्यवहारसामान्यतः स्वीकार्य है, क्योंकि ऑपरेटिंग सिस्टम प्रोग्राम समाप्ति पर शेष संसाधन जैसे स्मृति, फ़ाइलें, सॉकेट इत्यादि जारी करता है।[citation needed]


संदर्भ गिनती

पर्ल, पायथन (प्रोग्रामिंग भाषा) (सीपीथॉन कार्यान्वयन में),[20] एवं पीएचपी[21] संदर्भ गणना द्वारा वस्तु जीवनकाल का प्रबंधन करें, जिससे RAII का उपयोग करना संभव हो जाता है। जिन वस्तुओं को अब संदर्भित नहीं किया जाता है उन्हें तुरंत नष्ट कर दिया जाता है या अंतिम रूप दिया जाता है एवं जारी किया जाता है, इसलिए एक विध्वंसक या finalizer उस समय संसाधन जारी कर सकता है। हालांकि, यह हमेशा ऐसी भाषाओं में मुहावरेदार नहीं होता है, एवं विशेष रूप से पायथन में निराश होता है (संदर्भ प्रबंधकों के पक्ष में एवं कमजोर पैकेज से अंतिम रूप देने वालों के पक्ष में)।[citation needed] हालाँकि, वस्तु जीवन काल अनिवार्य रूप से किसी भी दायरे से बंधे नहीं हैं, एवं वस्तुओं को गैर-नियतात्मक रूप से नष्ट किया जा सकता है या बिल्कुल भी नहीं। यह गलती से उन संसाधनों को लीक करना संभव बनाता है जिन्हें किसी दायरे के अंत में जारी किया जाना चाहिए था। एक स्थिर चर (विशेष रूप से एक वैश्विक चर) में संग्रहीत वस्तुओं को कार्यक्रम के समाप्त होने पर अंतिम रूप नहीं दिया जा सकता है, इसलिए उनके संसाधन जारी नहीं किए जाते हैं; उदाहरण के लिए, सीपीथॉन ऐसी वस्तुओं को अंतिम रूप देने की कोई गारंटी नहीं देता है। इसके अलावा, परिपत्र संदर्भ वाली वस्तुएं एक साधारण संदर्भ काउंटर द्वारा एक त्र नहीं की जाएंगी, एवं अनिश्चित रूप से लंबे समय तक जीवित रहेंगी; भले ही एक त्र किया गया हो (अधिक परिष्कृत कचरा संग्रह द्वारा), विनाश का समय एवं विनाश का क्रम गैर-नियतात्मक होगा। CPython में एक साइकिल डिटेक्टर है जो चक्रों का पता लगाता है एवं चक्र में वस्तुओं को अंतिम रूप देता है, हालांकि CPython 3.4 से पहले, चक्रों को एक त्र नहीं किया जाता है यदि चक्र में किसी भी वस्तु को अंतिम रूप दिया जाता है।[22]


संदर्भ

  1. 1.0 1.1 Stroustrup, Bjarne (2017-09-30). "Why doesn't C++ provide a "finally" construct?". Retrieved 2019-03-09.
  2. Sutter, Herb; Alexandrescu, Andrei (2005). C++ Coding Standards. C++ In-Depth Series. Addison-Wesley. p. 24. ISBN 978-0-321-11358-0.
  3. "Scope guards". Dlang Tour. Retrieved 21 May 2021.
  4. "Gem #70: The Scope Locks Idiom". AdaCore (in English). Retrieved 21 May 2021.
  5. The Valadate Project. "Destruction". The Vala Tutorial version 0.30. Retrieved 21 May 2021.
  6. "RAII - Rust By Example". doc.rust-lang.org. Retrieved 2020-11-22.
  7. Stroustrup 1994, 16.5 Resource Management, pp. 388–89.
  8. Stroustrup 1994, 16.1 Exception Handling: Introduction, pp. 383–84.
  9. Stroustrup 1994, p. 389. I called this technique "resource acquisition is initialization."
  10. Michael Burr (2008-09-19). "How do you pronounce RAII?". Stack Overflow. Retrieved 2019-03-09.
  11. Arthur Tchaikovsky (2012-11-06). "Change official RAII to CADRe". ISO C++ Standard - Future Proposals. Google Groups. Retrieved 2019-03-09.
  12. Chou, Allen (2014-10-01). "Scope-Based Resource Management (RAII)". Retrieved 2019-03-09.
  13. "How can I handle a destructor that fails?". Standard C++ Foundation. Retrieved 2019-03-09.
  14. Richard Smith (2017-03-21). "Working Draft, Standard for ProgrammingLanguage C++" (PDF). Retrieved 2019-03-09.
  15. Stroustrup, Bjarne; Sutter, Herb (2020-08-03). "C++ Core Guidelines". Retrieved 2020-08-15.
  16. "I have too many try blocks; what can I do about it?". Standard C++ Foundation. Retrieved 2019-03-09.
  17. "Specifying Attributes of Variables". Using the GNU Compiler Collection (GCC). GNU Project. Retrieved 2019-03-09.
  18. Weimer, Westley; Necula, George C. (2008). "Exceptional Situations and Program Reliability" (PDF). ACM Transactions on Programming Languages and Systems. Vol. 30, no. 2.
  19. ildjarn (2011-04-05). "RAII and Stack unwinding". Stack Overflow. Retrieved 2019-03-09.
  20. "Extending Python with C or C++: Reference Counts". Extending and Embedding the Python Interpreter. Python Software Foundation. Retrieved 2019-03-09.
  21. hobbs (2011-02-08). "Does PHP support the RAII pattern? How?". Retrieved 2019-03-09.
  22. "gc — Garbage Collector interface". The Python Standard Library. Python Software Foundation. Retrieved 2019-03-09.


अग्रिम पठन


बाहरी संबंध