Nedaloma operacija

Straipsnis iš Vikipedijos, laisvosios enciklopedijos.
Peršokti į: navigaciją, paiešką

Nedaloma operacija (angl. atomic operation) – veiksmas, kuris, net ir vykdant programą vienu metu daugeliui gijų, atliekamas visas iš karto. Programuotojui nereikia rūpintis, jog kita gija ras tik pusiau įvykdyto nedalomo veiksmo rezultatus. Taip pat reikalaujama, jog jei nedaloma operacija nepavyksta, ji turi nepavykti visa – negali likti įvykdytų pradinių nepavykusios operacijos žingsnių rezultatų.

Pavyzdžiui, priskyrimo sakinys (C, C++ arba java)

int a;
a = 10;

yra nedalomas jei a kintamojo tipas (32 bitų sveikasis) toks, jog saugojimui skirtas bitų skaičius sutampa su procesoriaus žodžio ilgiu. Tuomet procesorius naują reikšmę greičiausiai rašys viena komanda. Kitos gijos gali aptikti arba senąją reikšmę, arba naująją – tarpinių reikšmių nebus. Nuorodų priskyrimas taip pat dažniausiai yra nedalomas veiksmas.

Tuo tarpu priskyrimo sakinys

double a;
a = 10.001;

gali ir nebūti nedalomas, nes slankaus kablelio skaičiui saugoti gali reikėti daugiau bitų nei telpa procesoriaus žodyje. Tada procesorius rašys naują reikšmę keletu komandų. Taigi, kitų gijų požiūriu, kintamąjame a gali trumpam pasirodyti nei pradinei, nei galutinei reikšmei nelygi tarpinė reikšmė.

Priskyrimo sakinys

long a;
a = 10;

nėra nedalomas veiksmas 32 bitų procesoriui, tačiau paprastai yra toks dabar pasirodžiusiems 64 bitų procesoriams.

Padidinimas vienetu

a = a + 1;

nėra nedaloma operacija ir negali būti saugiai vykdoma keleto gijų vienu metu. Procesoriai paprastai turi komandas atminties ląstelės reikšmei vienetu padidinti, todėl veiksmas

a ++;

kai kada gali būti ir nedalomas (priklauso nuo kompiliatoriaus).

Naudojant gijų sinchronizavimo bei rakinimo metodus, nedaloma galima paversti bet kokio sudėtingumo operaciją. Pavyzdžiui, (java)

synchronized (this)
  {
    a = 1;
    b = a + 1;
    c = a + b;
  }

trys priskyrimo sakiniai visi kartu yra nedaloma operacija. Tačiau ir sinchronizuota sakinių seka formaliai gali nedaloma nebūti jei nesėkmes atveju (kai metama išimtis) gali likti įvykdyta tik dalis sinchronizuotos sekcijos.