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

From Vigyanwiki
No edit summary
No edit summary
 
(15 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{short description|Programming idiom}}
{{short description|Programming idiom}}
संसाधन अधिग्रहण आरंभीकरण है आरएआईआई (RAII)<ref name="faq">{{cite web
'''संसाधन अधिग्रहण आरंभीकरण''' आरएआईआई (RAII)<ref name="faq">{{cite web
| url=http://www.stroustrup.com/bs_faq2.html#finally
| url=http://www.stroustrup.com/bs_faq2.html#finally
| title=Why doesn't C++ provide a "finally" construct?
| title=Why doesn't C++ provide a "finally" construct?
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> का [[प्रोग्रामिंग मुहावरा|प्रोग्रामिंग विशिष्ट स्वरूप]] हैI<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> विशेष भाषा के व्यवहार का वर्णन करने के लिए कई [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]], [[स्टेटिकली टाइप्ड प्रोग्रामिंग लैंग्वेज|स्टेटिकली टाइप्ड प्रोग्रामिंग भाषा]] में उपयोग किया जाता है। आरएआईआई में, संसाधन धारण करना [[वर्ग अपरिवर्तनीय]] है, एवं [[वस्तु जीवनकाल]] से बना हुआ है। [[कंस्ट्रक्टर (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]] द्वारा ऑब्जेक्ट क्रिएशन (विशेष रूप से इनिशियलाइज़ेशन) के समय [[संसाधन आवंटन (कंप्यूटर)]] (या अधिग्रहण) किया जाता है, जबकि डिस्ट्रक्टर (कंप्यूटर) द्वारा वस्तु नष्ट (विशेष रूप से फाइनलाइज़ेशन) के समय रिसोर्स डीलोकेशन (प्रस्तावित) किया जाता है। दूसरे शब्दों में, सफल होने के लिए आरंभीकरण के लिए संसाधन अधिग्रहण सफल होना चाहिए। इस प्रकार संसाधन को आरंभीकरण समाप्त होने एवं अंतिम रूप देने के मध्य आयोजित होने का आश्वासन दिया जाता है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]] उदाहरण ==
निम्न C++11 उदाहरण फ़ाइल एक  ्सेस और म्यूटेक्स लॉकिंग के लिए RAII के उपयोग को प्रदर्शित करता है:
<वाक्यविन्यास लैंग = सीपीपी>
#शामिल <fstream>
#शामिल <iostream>
#शामिल <म्यूटेक्स>
# शामिल करें
#शामिल <स्ट्रिंग>
 
शून्य राइट टूफाइल (स्थिरांक एसटीडी :: स्ट्रिंग और संदेश) {
  // |म्यूटेक्स| फ़ाइल | तक पहुंच की रक्षा करना है (जो धागे भर में साझा किया जाता है)।
  स्थिर एसटीडी :: [[म्युटेक्स]] म्युटेक्स;


  // लॉक | म्यूटेक्स | |फ़ाइल|तक पहुँचने से पहले।
== [[सी ++ 11|C ++ 11]] उदाहरण ==
   एसटीडी :: लॉक_गार्ड <एसटीडी :: म्यूटेक्स> लॉक (म्यूटेक्स);
निम्न C++11 उदाहरण फ़ाइल एक्सेस एवं म्यूटेक्स लॉकिंग के लिए आरएआईआई (RAII) के उपयोग को प्रदर्शित करता है
   /#include <fstream>


  // फ़ाइल खोलने का प्रयास करें।
#include <fstream>
  एसटीडी :: ऑफस्ट्रीम फ़ाइल (example.txt);
#include <mutex>
  अगर (! फ़ाइल is_open ()) {
#include <stdexcept>
    फेंक std::runtime_error (फ़ाइल खोलने में असमर्थ);
#include <string>
  }
 
void WriteToFile(const std::string& message) {
  //लिखें |संदेश| से |फ़ाइल|.
  // |mutex| is to protect access to |file| (which is shared across threads).
  फ़ाइल << संदेश << एसटीडी :: endl;
  static std::mutex mutex;
 
  // |फ़ाइल| गुंजाइश छोड़ते समय पहले बंद हो जाएगा (अपवाद की परवाह किए बिना)
  // Lock |mutex| before accessing |file|.
  // |म्यूटेक्स| स्कोप छोड़ते समय दूसरा (लॉक | डिस्ट्रक्टर से) अनलॉक किया जाएगा
  std::lock_guard<std::mutex> lock(mutex);
  // (अपवाद की परवाह किए बिना)
}
  // Try to open file.
</वाक्यविन्यास हाइलाइट>
  std::ofstream file("example.txt");
 
  if (!file.is_open()) {
यह कोड अपवाद-सुरक्षित है क्योंकि सी ++ गारंटी देता है कि सभी स्टैक ऑब्जेक्ट संलग्न दायरे के अंत में नष्ट हो जाते हैं, जिसे [[ढेर खोलना]] कहा जाता है। लॉक और फाइल ऑब्जेक्ट्स दोनों के विनाशकों को फ़ंक्शन से लौटने पर कॉल करने की गारंटी दी जाती है, चाहे कोई अपवाद फेंक दिया गया हो या नहीं।<ref>{{cite web
    throw std::runtime_error("unable to open file");
  }
  // Write |message| to |file|.
  file << message << std::endl;
  // |file| will be closed first when leaving scope (regardless of exception)
  // |mutex| will be unlocked second (from |lock| destructor) when leaving scope
  // (regardless of exception).
  }
यह कोड असामान्यता-सुरक्षित है क्योंकि C ++ आश्वासन देता है कि सभी स्टैक ऑब्जेक्ट संलग्न सीमा के अंत में नष्ट हो जाते हैं, जिसे [[ढेर खोलना|उद्घट्टन]] कहा जाता है। लॉक एवं फाइल ऑब्जेक्ट्स दोनों के विनाशकों को प्रोग्राम से प्रत्यागमन पर आह्वान करने का आश्वासन दिया जाता है, फिर कोई दोषकथन हो अथवा न हो।<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++
| date=2017-03-21
| date=2017-03-21
| author=Richard Smith
| author=Richard Smith
| access-date=2019-03-09}}</ref>
| access-date=2019-03-09}}</ref> आरएआईआई का उपयोग संसाधन प्रबंधन को अधिक सरल करता है, समग्र कोड आकार को अल्पकरता है एवं कार्यक्रम की शुद्धता सुनिश्चित करने में सहायता करता है। आरएआईआई (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 82: Line 77:
| first2=Herb
| first2=Herb
| author-link2=Herb Sutter
| author-link2=Herb Sutter
| access-date=2020-08-15}}</ref>
| access-date=2020-08-15}}</ref> एवं अधिकांश C ++ मानक पुस्तकालय विशिष्ट स्वरूप का पालन करते हैं।<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 85:


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


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


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


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




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


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 ++ में) को आरएआईआई के साथ भी नियंत्रित किया जा सकता है, जैसे कि आरएआईआई (स्टैक-आधारित) वस्तु नष्ट होने पर वस्तु निरंतर किया जाता है। इस प्रयोजन के लिए, 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> C ++ 98 में, एवं <code>boost::shared_ptr के माध्यम से</code> [[बूस्ट (सी ++ पुस्तकालय)|बूस्ट (C ++ पुस्तकालय)]] में भी उपलब्ध हैं।


== कंपाइलर क्लीनअप एक  ्सटेंशन ==
== कंपाइलर क्लीनअप एक्सटेंशन ==
[[बजना]] और जीएनयू कंपाइलर संग्रह दोनों आरएआईआई का समर्थन करने के लिए [[सी (प्रोग्रामिंग भाषा)]] भाषा के लिए एक  गैर-मानक एक  ्सटेंशन लागू करते हैं: क्लीनअप वेरिएबल विशेषता।<ref>{{Cite web
[[बजना|क्लैंग]] एवं जीएनयू कंपाइलर संग्रह दोनों आरएआईआई का समर्थन करने के लिए [[सी (प्रोग्रामिंग भाषा)|C (प्रोग्रामिंग भाषा)]] भाषा के लिए अन्य-मानक एक्सटेंशन प्रारम्भ करते हैं: क्लीनअप चर विशेषता <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
| work=Using the GNU Compiler Collection (GCC)
| work=Using the GNU Compiler Collection (GCC)
| publisher=[[GNU Project]]
| publisher=[[GNU Project]]
| access-date=2019-03-09}}</ref> निम्नलिखित एक  दिए गए विनाशक फ़ंक्शन के साथ एक  वैरिएबल को एनोटेट करता है जिसे वेरिएबल दायरे से बाहर होने पर कॉल करेगा:
| access-date=2019-03-09}}</ref> निम्नलिखित दिए गए विनाशक प्रोग्राम के साथ चर को एनोटेट करता है जिसे चर  सीमा से बाहर होने पर आह्वान करेगा:
void example_usage() {
  __attribute__((cleanup(fclosep))) FILE *logfile = fopen("logfile.txt", "w+");


<वाक्यविन्यास प्रकाश लैंग = सी>
  fputs("hello logfile!", logfile);
शून्य उदाहरण_उपयोग () {
}
  __attribute__((क्लीनअप(fclosep))) फ़ाइल *logfile = fopen(logfile.txt, w+);
इस उदाहरण में, कंपाइलर fclosep प्रोग्राम को उदाहरण_उपयोग रिटर्न से पहले लॉगफ़ाइल पर कॉल करने की व्यवस्था करता है।
  fputs (हैलो लॉगफाइल!, लॉगफाइल);
}
</वाक्यविन्यास हाइलाइट>
इस उदाहरण में, कंपाइलर fclosep फ़ंक्शन को example_usage रिटर्न से पहले लॉगफ़ाइल पर कॉल करने की व्यवस्था करता है।


== सीमाएं ==
== सीमाएं ==
आरएआईआई केवल स्टैक-आवंटित वस्तुओं द्वारा अधिग्रहित और जारी (प्रत्यक्ष या अप्रत्यक्ष रूप से) संसाधनों के लिए काम करता है,
आरएआईआई केवल स्टैक-आवंटित वस्तुओं द्वारा अधिग्रहित एवं निरंतर (प्रत्यक्ष या अप्रत्यक्ष रूप से) संसाधनों के लिए कार्य करता है, जहां उत्तम रूप से परिभाषित स्थिर वस्तु जीवनकाल है। हीप-आबंटित वस्तुएँ जो स्वयं संसाधनों को प्राप्त एवं निरंतर करती हैं, 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 137: Line 127:
| issue=2
| issue=2
| year=2008
| year=2008
| url=https://web.eecs.umich.edu/~weimerw/p/weimer-toplas2008.pdf}}</ref>{{rp|8:27}} चक्रीय रूप से संदर्भित वस्तुओं के लिए कमजोर पॉइंटर्स के साथ, सभी हीप ऑब्जेक्ट्स को प्रबंधित करने के लिए स्मार्ट पॉइंटर्स का उपयोग करके इसे प्राप्त किया जा सकता है।
| url=https://web.eecs.umich.edu/~weimerw/p/weimer-toplas2008.pdf}}</ref> चक्रीय रूप से संदर्भित वस्तुओं के लिए शक्तिहीन पॉइंटर्स के साथ, सभी हीप वस्तुओं को प्रबंधित करने के लिए स्मार्ट पॉइंटर्स का उपयोग करके इसे प्राप्त किया जा सकता है।


सी ++ में, स्टैक अनइंडिंग केवल तभी होने की गारंटी है जब अपवाद कहीं पकड़ा जाता है। ऐसा इसलिए है क्योंकि यदि किसी प्रोग्राम में कोई मिलान करने वाला हैंडलर नहीं मिलता है, तो फ़ंक्शन टर्मिनेट () कहा जाता है; इस कॉल को समाप्त करने से पहले स्टैक अवांछित है या नहीं () कार्यान्वयन-परिभाषित (15.5.1) है। (सी++03 मानक, §15.3/9)।<ref>{{cite web
C ++ में, स्टैक अनइंडिंग केवल तभी होने का आश्वासन देता है जब असामान्यता कहीं मिल जाता है। ऐसा इसलिए है क्योंकि यदि किसी प्रोग्राम में कोई मिलान करने वाला हैंडलर नहीं मिलता है, तो प्रोग्राम टर्मिनेट () कहा जाता है; इस आह्वान को समाप्त करने से पूर्व स्टैक अवांछित है या नहीं () कार्यान्वयन-परिभाषित (15.5.1) है। (C++03 मानक, §15.3/9)।<ref>{{cite web
| title=RAII and Stack unwinding
| title=RAII and Stack unwinding
| url=https://stackoverflow.com/a/5557651
| url=https://stackoverflow.com/a/5557651
Line 145: Line 135:
| 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> यह व्यवहार सामान्यतः स्वीकार्य है, क्योंकि ऑपरेटिंग प्रणाली प्रोग्राम समाप्ति पर शेष संसाधन जैसे स्मृति, फ़ाइलें, सॉकेट इत्यादि निरंतर करता है।
 




Line 154: Line 145:
| 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|फ़िनलिज़र (finalizer]]) उस समय संसाधन निरंतर कर सकता है। चूँकि, यह सदैव ऐसी भाषाओं में प्रयुक्तता नहीं होता है, एवं विशेष रूप से पायथन में निराश होता है ([[संदर्भ प्रबंधक|संदर्भ प्रबंधको]] की ओर में एवं शक्तिहीन पैकेज से अंतिम रूप देने वालों के ओर में)। चूँकि, वस्तु जीवन काल अनिवार्य रूप से किसी भी सीमा से बंधे नहीं हैं, एवं वस्तुओं को अन्य-नियतात्मक रूप से नष्ट किया जा सकता है या नहीं। यह अशुद्धि से उन संसाधनों को लीक करना संभव बनाता है जिन्हें किसी सीमा के अंत में निरंतर किया जाना चाहिए था। स्थिर गतिमान (विशेष रूप से [[वैश्विक चर|वैश्विक गतिमान]]) में संग्रहीत वस्तुओं को कार्यक्रम के समाप्त होने पर अंतिम रूप नहीं दिया जा सकता है, इसलिए उनके संसाधन निरंतर नहीं किए जाते हैं; उदाहरण के लिए, सी पायथन ऐसी वस्तुओं को अंतिम रूप देने का कोई आश्वासन नहीं देता है। इसके अतिरिक्त, परिपत्र संदर्भ वाली वस्तुएं साधारण संदर्भ पटल द्वारा एकत्र नहीं की जाएंगी, एवं अनिश्चित रूप से अधिक समय तक जीवित रहेंगी; अर्थात एकत्र किया गया हो (अधिक परिष्कृत संग्रह द्वारा), विनाश का समय एवं विनाश का क्रम अन्य-नियतात्मक होगा। सी पायथन (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
Line 188: Line 178:


==बाहरी संबंध==
==बाहरी संबंध==
{{wikibooks|C++ Programming|RAII}}
{{wikibooks|More C++ Idioms|Resource Acquisition Is Initialization}}
* Sample Chapter: "[https://www.informit.com/articles/article.aspx?p=30642&seqNum=8 Gotcha #67: Failure to Employ Resource Acquisition Is Initialization]" by Stephen C. Dewhurst
* Sample Chapter: "[https://www.informit.com/articles/article.aspx?p=30642&seqNum=8 Gotcha #67: Failure to Employ Resource Acquisition Is Initialization]" by Stephen C. Dewhurst
* Interview: "[https://www.artima.com/intv/modern3.html A Conversation with Bjarne Stroustrup]" by Bill Venners
* Interview: "[https://www.artima.com/intv/modern3.html A Conversation with Bjarne Stroustrup]" by Bill Venners
Line 198: Line 185:
* RAII in Delphi: "[http://blog.barrkel.com/2010/01/one-liner-raii-in-delphi.html One-liner RAII in Delphi]" by Barry Kelly
* RAII in Delphi: "[http://blog.barrkel.com/2010/01/one-liner-raii-in-delphi.html One-liner RAII in Delphi]" by Barry Kelly


{{C++ programming language}}
[[Category:C++ कोड उदाहरण के साथ लेख]]
{{Design Patterns patterns}}
[[Category:CS1 English-language sources (en)]]
[[Category: C++ कोड उदाहरण के साथ लेख]] [[Category: ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] [[Category: सॉफ्टवेयर डिजाइन पैटर्न]] [[Category: प्रोग्रामिंग मुहावरे]] [[Category: सी ++]]
[[Category:Collapse templates]]
 
 
 
[[Category: Machine Translated Page]]
[[Category:Created On 19/02/2023]]
[[Category:Created On 19/02/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Sidebars with styles needing conversion]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]

Latest revision as of 15:49, 27 October 2023

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

C ++ 11 उदाहरण

निम्न C++11 उदाहरण फ़ाइल एक्सेस एवं म्यूटेक्स लॉकिंग के लिए आरएआईआई (RAII) के उपयोग को प्रदर्शित करता है

 /#include <fstream>
#include <fstream>
#include <mutex>
#include <stdexcept>
#include <string>

void WriteToFile(const std::string& message) {
  // |mutex| is to protect access to |file| (which is shared across threads).
  static std::mutex mutex;

  // Lock |mutex| before accessing |file|.
  std::lock_guard<std::mutex> lock(mutex);

  // Try to open file.
  std::ofstream file("example.txt");
  if (!file.is_open()) {
    throw std::runtime_error("unable to open file");
  }

  // Write |message| to |file|.
  file << message << std::endl;

  // |file| will be closed first when leaving scope (regardless of exception)
  // |mutex| will be unlocked second (from |lock| destructor) when leaving scope
  // (regardless of exception).
  }

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


लाभ

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

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

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

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


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

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

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

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

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

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

void example_usage() {
  __attribute__((cleanup(fclosep))) FILE *logfile = fopen("logfile.txt", "w+");
  fputs("hello logfile!", logfile);
}

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

सीमाएं

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

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


संदर्भ गिनती

पर्ल, पायथन (प्रोग्रामिंग भाषा) (सीपीथॉन कार्यान्वयन में),[20] एवं पीएचपी[21] संदर्भ गणना द्वारा वस्तु जीवनकाल का प्रबंधन करें, जिससे आरएआईआई (RAII) का उपयोग करना संभव हो जाता है। जिन वस्तुओं को अब संदर्भित नहीं किया जाता है उन्हें तुरंत नष्ट कर दिया जाता है या अंतिम रूप दिया जाता है एवं निरंतर किया जाता है, इसलिए विध्वंसक या फ़िनलिज़र (finalizer) उस समय संसाधन निरंतर कर सकता है। चूँकि, यह सदैव ऐसी भाषाओं में प्रयुक्तता नहीं होता है, एवं विशेष रूप से पायथन में निराश होता है (संदर्भ प्रबंधको की ओर में एवं शक्तिहीन पैकेज से अंतिम रूप देने वालों के ओर में)। चूँकि, वस्तु जीवन काल अनिवार्य रूप से किसी भी सीमा से बंधे नहीं हैं, एवं वस्तुओं को अन्य-नियतात्मक रूप से नष्ट किया जा सकता है या नहीं। यह अशुद्धि से उन संसाधनों को लीक करना संभव बनाता है जिन्हें किसी सीमा के अंत में निरंतर किया जाना चाहिए था। स्थिर गतिमान (विशेष रूप से वैश्विक गतिमान) में संग्रहीत वस्तुओं को कार्यक्रम के समाप्त होने पर अंतिम रूप नहीं दिया जा सकता है, इसलिए उनके संसाधन निरंतर नहीं किए जाते हैं; उदाहरण के लिए, सी पायथन ऐसी वस्तुओं को अंतिम रूप देने का कोई आश्वासन नहीं देता है। इसके अतिरिक्त, परिपत्र संदर्भ वाली वस्तुएं साधारण संदर्भ पटल द्वारा एकत्र नहीं की जाएंगी, एवं अनिश्चित रूप से अधिक समय तक जीवित रहेंगी; अर्थात एकत्र किया गया हो (अधिक परिष्कृत संग्रह द्वारा), विनाश का समय एवं विनाश का क्रम अन्य-नियतात्मक होगा। सी पायथन (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.


अग्रिम पठन


बाहरी संबंध