Lenktynių aplinka
Lenktynių aplinka (angl. race condition) – situacija, kuomet reali įvykių seka nesutampa su ta, kurios tikėjosi sistemą kuriantis žmogus. Terminas pradėtas vartoti nuo maždaug 1954 metų, iš pradžių skaitmeninės elektronikos prietaisams.[1] Šiuo metu tai dažna programavimo problema. Vienas žinomų šios klaidos atvejų yra Therac-25 programavimo klaida, dėl kurios spindulinės terapijos mašina apšvitindavo ligonius gerokai per didelėmis radiacijos dozėmis.[2]
Taip atsitinka kuomet objektu, kintamuoju, atminties sritimi vienu metu manipuliuoja du ar daugiau vienu lygiagrečiai vykstančių procesų (gijų) arba kartais gija viena bet jos atliekamų veiksmų eilė atsitiktinė ir nenumatoma.[3] Pavyzdžiui, šis metodas (java):
static int skaitiklis;
int kita_reikšmė() {
skaitiklis = skaitiklis + 1;
// Kita gija gali šioje vietoje padidinti skaitiklį dar kartą.
return skaitiklis;
},
jei vykdomas kelių gijų vienu metu, gali keliskart grąžinti tą pačią skaitiklio reikšmę, ko nepatyręs programuotojas paprastai nesitiki.
Dažna taip pat situacija, kuomet vienas iš dviejų bendras vidines struktūras turinčių objektų modifikuojamas taip, jog antrasis nebegali teisingai atlikti savo funkcijas. Objektai turi bendrų vidinių struktūrų jei juose esama nuorodų į tą patį trečią objektą. Neteisinga darbą sukelia pasikeitusi šio bendro objekto būsena.
Klasikinis konkurentinės modifikacijos pavyzdys yra kolekcija ir jos iteratorius. Modifikavus kolekciją, iteratorius neretai nebegali teisingai tęsti savo darbo, nes pasikeitė su juo susijusi kolekcija. Jei vienas procesas naudoja iteratorių peržiūrėti visiems kolekcijos elementas or kits (lygiagretus) procesas kurį nors elementą tuo pat metu prideda ar išmeta, pirmojo proceso darbo rezultatas gali būti visiškai klaidingas.[4]
Dažnai lenktynių aplinkos yra labai sunkiai aptinkamos. Jos gali būti ištaisomos įvairiais semaforais. Taip pat naudojami nekintantys objektai, kurie savo būsenų kartą sukurti nekeičia.
Išnašos
[redaguoti | redaguoti vikitekstą]- ↑ Huffman, David A. "The synthesis of sequential switching circuits." (1954).
- ↑ Leveson, Nancy G.; Turner, Clark S. (1993 m. liepos mėn.). „An Investigation of the Therac-25 Accidents“ (PDF). IEEE Computer. 26 (7): 18–41. doi:10.1109/MC.1993.274940. Suarchyvuotas originalas (PDF) 2004-11-28.
- ↑ „Working Draft, Standard for Programming Language C++“ (PDF). 2014-11-19.
- ↑ ConcurrentModificationException in Java. JavaPoint