Комп'ютерна програма або підпрограма є повторновикористовною або інакше повторновхідною (англ. reentrant), якщо вона може бути безпечно викликана знову до завершення роботи її попереднього виклику (тобто вона може бути безпечно виконана паралельно).
Щоб бути повтороновикористовною, комп'ютерна програма або підпрограма:
- Повинна утриматися від використання статичних (або глобальних) неконастантних даних.
- Повинна не повертати покажчик на статичні (або глобальні) неконстантні дані.
- Повинна працювати лише з даними наданими їй підпрограмою, що її викликає.
- Повинна відмовитись від покладання на блокування ресурсів типу сінглтон.
- Повинна відмовитись від зміни власного коду. (хіба тільки такого, що виконується в її власному потоковому сховищі)
- Повинна не викликати неповторновикористовні комп'ютерні програми або підпрограми.
Отримання і пояснення правил
Підпрограма продукує вихідні дані з вхідних даних (в деяких випадках можна обійтись без вхідних даних і/або не звертати уваги на вихідні). Усі спільні дані можуть бути використані, змінені будь-ким, будь-коли. Якщо дані можуть бути змінені будь-ким (і ніхто не може відслідкувати ці зміни) тоді для тих хто використовує ці дані немає гарантії, що дані не змінились з часу останнього використання.
Дані бувають глобальні та локальні.
Локальні дані не розподіляються між будь-якими, повторновхідними або ні, підпрограмами; значить вони не впливають на повторновхідність. Глобальні дані можуть спільно використовуватись будь-якими підпрограмами, якщо це глобальні змінні, або спільно використовуватись функціями з однаковим ім'ям, якщо це статичні змінні; від того вони можуть впливати на повторновхідність.
- Не має використовувати статичні (або глобальні) неконстантні дані.
Вірно тільки якщо спільні змінні змінюють адресу під час виконання або коли програма виконується знов. Абсолютні адреси глобальних констант безпечні, якщо тільки вони не змінюються зовні.
- Не повинна повертати адресу статичних (або глобальних) неконстантних даних.
Звичайні вхідні дані підпрограми ніколи не є спільними, бо кожна підпрограма має свою власну копію.
- Має працювати тільки з даними забезпеченими викликовою підпрограмою.
Використання блокування має сенс тільки для неконстантних спільних даних. Блокування константних даних не впливає на їх обробку.
- Не повинна покладатись на блокування ресурсів одинаків.
Операційна система може дозволяти процесу змінювати власний код. Є багато причин, щоб зробити це, але це означає, що наступного разу код може бути відмінним.
- Повинна відмовитись від модифікації власного коду.
Вона може змінювати себе у випадку розміщення в своїй окремій пам'яті. Це означає, що для кожного нового виклику використовується інше фізичне розташування машинного коду, куди копіюється первісний код.
- Не має викликати неповторновикористовні програми або підпрограми.
Приклади
Багаторівневість 'user/object/process priority' та/або багатопроцесорність зазвичай ускладнюють написання повторновикористовного коду. Також, IO коди[] здебільшого не повторновхідні через використання ресурсу одинака, такого як диск.
Повторновхідність є ключовою властивістю функціонального програмування.
Типово, що рекурсивні підпрограми мають бути повторновхідними. Також підпрограми, що прямо або непрямо викликаються з обробника переривань зазвичай мають бути повторновхідними.
Приклади коду
В наступному відтинку коду на C, ані f
, ані g
не є повторновхідними.
int g_var = 1; int f() { g_var = g_var + 2; return g_var; } int g() { return f() + 2; }
В попередньому коді, f
залежить від неконстантної глобальної змінної g_var; таким чином, якщо два потоки викличуть цю підпрограму і використають g_var
одночасно, тоді можливе отримання різних результатів в залежності від розподілу часу виконання. Значить, f
неповторновхідна. Це ж вірно і для g
; вона викликає f
, яка є неповторновхідною.
Незначно змінена версія буде повторновхідною:
int f(int i) { return i + 2; } int g(int i) { return f(i) + 2; }
Примітки
- "Interrupt Predictability"by Jack Ganssle 1995
Посилання
- Стаття «Use reentrant functions for safer signal handling». (англ.)
- "Написання повторновхідного і потоко-безпечного коду, " з AIX Version 4.3 General Programming Concepts: Writing and Debugging Programs, 2nd edition, 1999. (англ.)
- http://www.ibm.com/developerworks/linux/library/l-reent.html (англ.)
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Komp yuterna programa abo pidprograma ye povtornovikoristovnoyu abo inakshe povtornovhidnoyu angl reentrant yaksho vona mozhe buti bezpechno viklikana znovu do zavershennya roboti yiyi poperednogo vikliku tobto vona mozhe buti bezpechno vikonana paralelno Shob buti povtoronovikoristovnoyu komp yuterna programa abo pidprograma Povinna utrimatisya vid vikoristannya statichnih abo globalnih nekonastantnih danih Povinna ne povertati pokazhchik na statichni abo globalni nekonstantni dani Povinna pracyuvati lishe z danimi nadanimi yij pidprogramoyu sho yiyi viklikaye Povinna vidmovitis vid pokladannya na blokuvannya resursiv tipu singlton Povinna vidmovitis vid zmini vlasnogo kodu hiba tilki takogo sho vikonuyetsya v yiyi vlasnomu potokovomu shovishi Povinna ne viklikati nepovtornovikoristovni komp yuterni programi abo pidprogrami Otrimannya i poyasnennya pravilPidprograma produkuye vihidni dani z vhidnih danih v deyakih vipadkah mozhna obijtis bez vhidnih danih i abo ne zvertati uvagi na vihidni Usi spilni dani mozhut buti vikoristani zmineni bud kim bud koli Yaksho dani mozhut buti zmineni bud kim i nihto ne mozhe vidslidkuvati ci zmini todi dlya tih hto vikoristovuye ci dani nemaye garantiyi sho dani ne zminilis z chasu ostannogo vikoristannya Dani buvayut globalni ta lokalni Lokalni dani ne rozpodilyayutsya mizh bud yakimi povtornovhidnimi abo ni pidprogramami znachit voni ne vplivayut na povtornovhidnist Globalni dani mozhut spilno vikoristovuvatis bud yakimi pidprogramami yaksho ce globalni zminni abo spilno vikoristovuvatis funkciyami z odnakovim im yam yaksho ce statichni zminni vid togo voni mozhut vplivati na povtornovhidnist Ne maye vikoristovuvati statichni abo globalni nekonstantni dani Virno tilki yaksho spilni zminni zminyuyut adresu pid chas vikonannya abo koli programa vikonuyetsya znov Absolyutni adresi globalnih konstant bezpechni yaksho tilki voni ne zminyuyutsya zovni Ne povinna povertati adresu statichnih abo globalnih nekonstantnih danih Zvichajni vhidni dani pidprogrami nikoli ne ye spilnimi bo kozhna pidprograma maye svoyu vlasnu kopiyu Maye pracyuvati tilki z danimi zabezpechenimi viklikovoyu pidprogramoyu Vikoristannya blokuvannya maye sens tilki dlya nekonstantnih spilnih danih Blokuvannya konstantnih danih ne vplivaye na yih obrobku Ne povinna pokladatis na blokuvannya resursiv odinakiv Operacijna sistema mozhe dozvolyati procesu zminyuvati vlasnij kod Ye bagato prichin shob zrobiti ce ale ce oznachaye sho nastupnogo razu kod mozhe buti vidminnim Povinna vidmovitis vid modifikaciyi vlasnogo kodu Vona mozhe zminyuvati sebe u vipadku rozmishennya v svoyij okremij pam yati Ce oznachaye sho dlya kozhnogo novogo vikliku vikoristovuyetsya inshe fizichne roztashuvannya mashinnogo kodu kudi kopiyuyetsya pervisnij kod Ne maye viklikati nepovtornovikoristovni programi abo pidprogrami PrikladiBagatorivnevist user object process priority ta abo bagatoprocesornist zazvichaj uskladnyuyut napisannya povtornovikoristovnogo kodu Takozh IO kodi utochniti zdebilshogo ne povtornovhidni cherez vikoristannya resursu odinaka takogo yak disk Povtornovhidnist ye klyuchovoyu vlastivistyu funkcionalnogo programuvannya Tipovo sho rekursivni pidprogrami mayut buti povtornovhidnimi Takozh pidprogrami sho pryamo abo nepryamo viklikayutsya z obrobnika pererivan zazvichaj mayut buti povtornovhidnimi Prikladi koduV nastupnomu vidtinku kodu na C ani f ani g ne ye povtornovhidnimi int g var 1 int f g var g var 2 return g var int g return f 2 V poperednomu kodi f zalezhit vid nekonstantnoyi globalnoyi zminnoyi g var takim chinom yaksho dva potoki viklichut cyu pidprogramu i vikoristayut g var odnochasno todi mozhlive otrimannya riznih rezultativ v zalezhnosti vid rozpodilu chasu vikonannya Znachit f nepovtornovhidna Ce zh virno i dlya g vona viklikaye f yaka ye nepovtornovhidnoyu Neznachno zminena versiya bude povtornovhidnoyu int f int i return i 2 int g int i return f i 2 Primitki Interrupt Predictability by Jack Ganssle 1995PosilannyaStattya Use reentrant functions for safer signal handling angl Napisannya povtornovhidnogo i potoko bezpechnogo kodu z AIX Version 4 3 General Programming Concepts Writing and Debugging Programs 2nd edition 1999 angl http www ibm com developerworks linux library l reent html angl Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi