Pereiti prie turinio

Lenktynių aplinka

Straipsnis iš Vikipedijos, laisvosios enciklopedijos.
Lenktynių aplinka loginėje elektronikoje. Trikampio formos loginis elementas kairėje yra elementas NE (keičia loginį lygmenį priešingu). Elementas dešinėje yra elementas IR. Teoriškai šio elemento išėjime visada turi būti loginis nulis (A ir „ne A“ kartu niekada nebūna). Tačiau dėl signalo vėlavimo elemente NE (Δt1), pasikeitus sistemos įėjimo lygmeniui, ji suformuoja trumpą „vieneto“ lygmens impulsą.

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.

  1. Huffman, David A. "The synthesis of sequential switching circuits." (1954).
  2. 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.
  3. „Working Draft, Standard for Programming Language C++“ (PDF). 2014-11-19.
  4. ConcurrentModificationException in Java. JavaPoint