Ця стаття містить правописні, лексичні, граматичні, стилістичні або інші мовні помилки, які треба виправити. |
Resource Acquisition Is Initialization (RAII), перекладається як «Отримання ресурсу є ініціалізація» — , яка використовується в деяких об`єктно-орієнтовних мовах програмування, більшою мірою в , звідки вона взяла початок, але також застосовується в D, Ada, і Vala.
Відповідно RAII, утримання ресурсу тісно прив'язане до життєвого циклу об'єкта: алокація ресурсу (отримання) відбувається в момент створення об'єкта за допомогою конструктора, а деаллокація (звільнення) відбувається в момент знищення об'єкта за допомогою деструктора. Якщо об'єкти видаляються правильно, витоків ресурсів не відбувається.
Інші назви цієї ідіоми: Constructor Acquires, Destructor Releases (CADRe) і Scope-based Resource Management (SBRM);
Переваги
Перевагами RAII, як техніки керування ресурсами є те, що вона забезпечує інкапсуляцію, безпечність при виняткових ситуаціях (для відслідковування ресурсів), і локальність (дозволяє написати логіку отримання ресурсу і вивільнення поруч в одному місці).
Інкапсуляція забезпечується тим, що логіка управління ресурсами описана один раз в класі, а не в кожному місці де вона використовується. Безпека при виняткових ситуаціях забезпечується для стекових ресурсів (ресурси звільняються в тій самій області видимості в якій вони були створені) завдяки прив'язці до життєвого циклу стекової змінної (локальної змінної оголошеної в даному блоці): якщо виникає виняткова ситуація (англ. exception), і існує відповідний блок відловлювання помилок, єдиний код, який буде завжди виконаний після виходу із даної області видимості, це деструктори об'єктів об'явлених в цій області видимості. Локальність, забезпечується завдяки написанню конструктора і деструктора у визначенні класу поруч один з одним.
Управління ресурсами, таким чином, повинно бути тісно прив'язаним до тривалості життя відповідних об'єктів, щоб отримати автоматичну алокацію й очищення. Ресурси створюються в процесі ініціалізації, коли немає жодної можливості використати їх раніше, перш ніж вони стануть доступними й звільнити їх гарантовано, навіть у разі виникнення помилок.
Типове застосування
RAII часто використовується для контролювання замикання м'ютексу (mutex) у багатопотокових застосуваннях. В такому випадку, при знищенні об'єкт гарантовано відпускає м'ютекс. Без застосування RAII існує потенційна загроза взаємного блокування (deadlock) м'ютексів. При використанні RAII, в код, який бере м'ютекс включає в собі логіку в якій м'ютекс буде звільнено коли виконання програми вийде за область видимості об'єкта.
Інше типове застосування, це робота з файлами: ми можемо мати об'єкт, який зберігає посилання на файл, який буде відкритий для запису в конструкторі, і закритий в деструкторі. В обох випадках, RAII гарантує лише те, що ресурс буде звільнено коректно, але програмісту слід контролювати безпеку при виникненні виняткових ситуацій власноруч. Якщо код, який проводить модифікацію даних, не є безпечним, м'ютекс може бути не взятий, або файл закритий так, що структура даних файлу буде пошкоджена.
Керування динамічно виділеними об'єктами також можна здійснювати за допомогою RAII. Для цього стандартна бібліотека C++ 11 має реалізацію так званого розумного вказівника std::unique_ptr для об'єкта з одним власником, і std::shared_ptr для об'єктів, на які існує декілька посилань. Схожі реалізації також існують в C++ 98 — std::auto_ptr і в бібліотеці Boost — boost::shared_ptr.
Приклад на C++11
Наступний приклад на C++11 демонструє використання RAII для доступу до файлів і синхронізації м'ютексів:
#include <string> #include <mutex> #include <iostream> #include <fstream> #include <stdexcept> void write_to_file (const std::string & message) { // м’ютекс для захисту доступу для файлу static std::mutex mutex; // взяття м’ютексу перед операціями з файлом std::lock_guard<std::mutex> lock(mutex); // перевірка відкриття файлу std::ofstream file("example.txt"); if (!file.is_open()) throw std::runtime_error("Не можливо відкрити файл"); // запис повідомлення до файлу file << message << std::endl; // файл буде закритий першим при покиданні області видимості (незалежно від виняткових ситуацій) // м’ютекс буде звільнений другим (в деструкторі lock) }
Цей код є безпечним для виняткових ситуацій, оскільки C++ гарантує, що всі стекові об'єкти будуть знищенні після покидання області видимості. Деструктор для обох об'єктів: lock і file гарантовано буде викликаний при поверненні управління із функції, не залежно від того сталася виняткова ситуація (exception) чи ні.
Локальні змінні дозволяють легко керувати кількома ресурсами в одній функції: вони знищуються у зворотньому порядку відповідно до того, як створювалися, а об'єкти знищуються лише тоді, коли вони були вдало створені, якщо не відбулося виняткових ситуацій в момент створення об'єкта.
Використання RAII значно спрощує процедуру управління ресурсами, зменшує об'єми коду і дозволяє пересвідчитися в коректності програми, тому більша частина стандартної бібліотеки C++ дотримується цієї ідіоми.
Примітки
- . Архів оригіналу за 4 липня 2014. Процитовано 11 липня 2014.
{{}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title () - Masterminds of Programming: Conversations with the Creators of Major Programming Languages, с. 4, на «Google Books», O'Reilly Media, Inc., 21 бер. 2009–496 стор.
- . Архів оригіналу за 17 лютого 2013. Процитовано 12 лютого 2013.
- . Архів оригіналу за 9 жовтня 2014. Процитовано 12 лютого 2013.
- . Архів оригіналу за 11 травня 2014. Процитовано 12 лютого 2013.
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya mistit pravopisni leksichni gramatichni stilistichni abo inshi movni pomilki yaki treba vipraviti Vi mozhete dopomogti vdoskonaliti cyu stattyu pogodivshi yiyi iz chinnimi movnimi standartami Resource Acquisition Is Initialization RAII perekladayetsya yak Otrimannya resursu ye inicializaciya yaka vikoristovuyetsya v deyakih ob yektno oriyentovnih movah programuvannya bilshoyu miroyu v C zvidki vona vzyala pochatok ale takozh zastosovuyetsya v D Ada i Vala Vidpovidno RAII utrimannya resursu tisno priv yazane do zhittyevogo ciklu ob yekta alokaciya resursu otrimannya vidbuvayetsya v moment stvorennya ob yekta za dopomogoyu konstruktora a deallokaciya zvilnennya vidbuvayetsya v moment znishennya ob yekta za dopomogoyu destruktora Yaksho ob yekti vidalyayutsya pravilno vitokiv resursiv ne vidbuvayetsya Inshi nazvi ciyeyi idiomi Constructor Acquires Destructor Releases CADRe i Scope based Resource Management SBRM PerevagiPerevagami RAII yak tehniki keruvannya resursami ye te sho vona zabezpechuye inkapsulyaciyu bezpechnist pri vinyatkovih situaciyah dlya vidslidkovuvannya resursiv i lokalnist dozvolyaye napisati logiku otrimannya resursu i vivilnennya poruch v odnomu misci Inkapsulyaciya zabezpechuyetsya tim sho logika upravlinnya resursami opisana odin raz v klasi a ne v kozhnomu misci de vona vikoristovuyetsya Bezpeka pri vinyatkovih situaciyah zabezpechuyetsya dlya stekovih resursiv resursi zvilnyayutsya v tij samij oblasti vidimosti v yakij voni buli stvoreni zavdyaki priv yazci do zhittyevogo ciklu stekovoyi zminnoyi lokalnoyi zminnoyi ogoloshenoyi v danomu bloci yaksho vinikaye vinyatkova situaciya angl exception i isnuye vidpovidnij blok vidlovlyuvannya pomilok yedinij kod yakij bude zavzhdi vikonanij pislya vihodu iz danoyi oblasti vidimosti ce destruktori ob yektiv ob yavlenih v cij oblasti vidimosti Lokalnist zabezpechuyetsya zavdyaki napisannyu konstruktora i destruktora u viznachenni klasu poruch odin z odnim Upravlinnya resursami takim chinom povinno buti tisno priv yazanim do trivalosti zhittya vidpovidnih ob yektiv shob otrimati avtomatichnu alokaciyu j ochishennya Resursi stvoryuyutsya v procesi inicializaciyi koli nemaye zhodnoyi mozhlivosti vikoristati yih ranishe persh nizh voni stanut dostupnimi j zvilniti yih garantovano navit u razi viniknennya pomilok Tipove zastosuvannyaRAII chasto vikoristovuyetsya dlya kontrolyuvannya zamikannya m yuteksu mutex u bagatopotokovih zastosuvannyah V takomu vipadku pri znishenni ob yekt garantovano vidpuskaye m yuteks Bez zastosuvannya RAII isnuye potencijna zagroza vzayemnogo blokuvannya deadlock m yuteksiv Pri vikoristanni RAII v kod yakij bere m yuteks vklyuchaye v sobi logiku v yakij m yuteks bude zvilneno koli vikonannya programi vijde za oblast vidimosti ob yekta Inshe tipove zastosuvannya ce robota z fajlami mi mozhemo mati ob yekt yakij zberigaye posilannya na fajl yakij bude vidkritij dlya zapisu v konstruktori i zakritij v destruktori V oboh vipadkah RAII garantuye lishe te sho resurs bude zvilneno korektno ale programistu slid kontrolyuvati bezpeku pri viniknenni vinyatkovih situacij vlasnoruch Yaksho kod yakij provodit modifikaciyu danih ne ye bezpechnim m yuteks mozhe buti ne vzyatij abo fajl zakritij tak sho struktura danih fajlu bude poshkodzhena Keruvannya dinamichno vidilenimi ob yektami takozh mozhna zdijsnyuvati za dopomogoyu RAII Dlya cogo standartna biblioteka C 11 maye realizaciyu tak zvanogo rozumnogo vkazivnika std unique ptr dlya ob yekta z odnim vlasnikom i std shared ptr dlya ob yektiv na yaki isnuye dekilka posilan Shozhi realizaciyi takozh isnuyut v C 98 std auto ptr i v biblioteci Boost boost shared ptr Priklad na C 11Nastupnij priklad na C 11 demonstruye vikoristannya RAII dlya dostupu do fajliv i sinhronizaciyi m yuteksiv include lt string gt include lt mutex gt include lt iostream gt include lt fstream gt include lt stdexcept gt void write to file const std string amp message m yuteks dlya zahistu dostupu dlya fajlu static std mutex mutex vzyattya m yuteksu pered operaciyami z fajlom std lock guard lt std mutex gt lock mutex perevirka vidkrittya fajlu std ofstream file example txt if file is open throw std runtime error Ne mozhlivo vidkriti fajl zapis povidomlennya do fajlu file lt lt message lt lt std endl fajl bude zakritij pershim pri pokidanni oblasti vidimosti nezalezhno vid vinyatkovih situacij m yuteks bude zvilnenij drugim v destruktori lock Cej kod ye bezpechnim dlya vinyatkovih situacij oskilki C garantuye sho vsi stekovi ob yekti budut znishenni pislya pokidannya oblasti vidimosti Destruktor dlya oboh ob yektiv lock i file garantovano bude viklikanij pri povernenni upravlinnya iz funkciyi ne zalezhno vid togo stalasya vinyatkova situaciya exception chi ni Lokalni zminni dozvolyayut legko keruvati kilkoma resursami v odnij funkciyi voni znishuyutsya u zvorotnomu poryadku vidpovidno do togo yak stvoryuvalisya a ob yekti znishuyutsya lishe todi koli voni buli vdalo stvoreni yaksho ne vidbulosya vinyatkovih situacij v moment stvorennya ob yekta Vikoristannya RAII znachno sproshuye proceduru upravlinnya resursami zmenshuye ob yemi kodu i dozvolyaye peresvidchitisya v korektnosti programi tomu bilsha chastina standartnoyi biblioteki C dotrimuyetsya ciyeyi idiomi Primitki Arhiv originalu za 4 lipnya 2014 Procitovano 11 lipnya 2014 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Obslugovuvannya CS1 Storinki z tekstom archived copy yak znachennya parametru title posilannya Masterminds of Programming Conversations with the Creators of Major Programming Languages s 4 na Google Books O Reilly Media Inc 21 ber 2009 496 stor Arhiv originalu za 17 lyutogo 2013 Procitovano 12 lyutogo 2013 Arhiv originalu za 9 zhovtnya 2014 Procitovano 12 lyutogo 2013 Arhiv originalu za 11 travnya 2014 Procitovano 12 lyutogo 2013 Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi