Programiranje

Kdaj uporabiti hlapljivo ključno besedo v jeziku C #

Tehnike optimizacije, ki jih uporablja prevajalnik JIT (ravno pravočasno) v času izvajanja skupnega jezika, lahko privedejo do nepredvidljivih rezultatov, ko vaš program .Net poskuša izvajati nehlapna branja podatkov v večnitnem scenariju. V tem članku bomo preučili razlike med hlapnim in nehlapnim dostopom do pomnilnika, vlogo volatilne ključne besede v C # in kako uporabiti volatilno ključno besedo.

Za ponazoritev konceptov bom navedel nekaj primerov kode v jeziku C #. Da bi razumeli, kako deluje spremenljiva ključna beseda, moramo najprej razumeti, kako deluje strategija optimizacije prevajalnika JIT v .Net.

Razumevanje optimizacij prevajalnika JIT

Upoštevati je treba, da bo prevajalnik JIT kot del optimizacijske strategije spremenil vrstni red branja in pisanja na način, ki ne bo spremenil pomena in končnega izhoda programa. To je prikazano v spodnjem delčku kode.

x = 0;

x = 1;

Zgornji delček kode lahko spremenite v naslednjega, pri tem pa ohranite prvotno semantiko programa.

x = 1;

Prevajalnik JIT lahko za optimizacijo naslednje kode uporabi tudi koncept, imenovan "stalno širjenje".

x = 1;

y = x;

Zgornji delček kode lahko spremenite v naslednjega - znova ob ohranjanju prvotne semantike programa.

x = 1;

y = 1;

Hlapen in nehlapen dostop do pomnilnika

Spominski model sodobnih sistemov je precej zapleten. Imate registre procesorjev, različne ravni predpomnilnikov in glavni pomnilnik v skupni rabi več procesorjev. Ko se program zažene, lahko procesor predpomni podatke in nato do njih dostopa iz predpomnilnika, ko to zahteva izvršilna nit. Posodobitve in branje teh podatkov se lahko izvajajo v predpomnjeni različici podatkov, medtem ko se glavni pomnilnik posodobi pozneje. Ta model uporabe pomnilnika ima posledice za večnitne aplikacije.

Ko ena nit sodeluje s podatki v predpomnilniku in druga nit istočasno poskuša prebrati iste podatke, lahko druga nit bere zastarelo različico podatkov iz glavnega pomnilnika. To je zato, ker se pri posodobitvi vrednosti nehlapnega predmeta sprememba izvede v predpomnilniku izvršilne niti in ne v glavnem pomnilniku. Ko pa se vrednost volatilnega objekta posodobi, se ne samo spremeni predpomnilnik izvršilne niti, ampak se ta predpomnilnik nato izpere v glavni pomnilnik. In ko se prebere vrednost hlapnega predmeta, nit osveži svoj predpomnilnik in prebere posodobljeno vrednost.

Uporaba volatile ključne besede v C #

Hlapljiva ključna beseda v C # se uporablja za obveščanje prevajalnika JIT, da vrednosti spremenljivke ne bi smeli nikoli shraniti v predpomnilnik, ker jo lahko spremeni operacijski sistem, strojna oprema ali sočasno izvajana nit. Prevajalnik se tako izogiba kakršni koli optimizaciji spremenljivke, ki bi lahko povzročila konflikte podatkov, torej različnim nitam, ki dostopajo do različnih vrednosti spremenljivke.

Ko predmet ali spremenljivko označite kot nestanovitno, postane kandidat za volatilno branje in pisanje. Upoštevati je treba, da so v C # vsa zapisovanja v pomnilnik spremenljiva, ne glede na to, ali podatke pišete v nestanoviten ali nehlapen predmet. Nejasnost pa se zgodi, ko berete podatke. Ko berete nehlapne podatke, lahko izvrševalna nit vedno ali pa ne vedno dobi najnovejšo vrednost. Če je predmet hlapljiv, nit vedno dobi najnovejšo vrednost.

Spremenljivko lahko razglasite za spremenljivo, tako da jo predpišete z hlapljivo ključna beseda. Naslednji delček kode to ponazarja.

razredni program

    {

javno nestanovitno int i;

statična praznina Main (string [] args)

        {

// Tukaj napišite kodo

        }

    }

Lahko uporabite hlapljivo ključna beseda s poljubnimi vrstami referenc, kazalcev in naštevalcev. Hlapni modifikator lahko uporabite tudi z bajtnimi, kratkimi, int, char, float in bool vrstami. Upoštevati je treba, da lokalnih spremenljivk ni mogoče razglasiti za spremenljive. Ko podate predmet referenčnega tipa kot nestanoviten, je spremenljiv le kazalec (32-bitno celo število, ki kaže na mesto v pomnilniku, kjer je predmet dejansko shranjen), in ne vrednost primerka. Tudi dvojna spremenljivka ne more biti volatilna, ker je velika 64 bitov in je večja od velikosti besede v sistemih x86. Če morate narediti dvojno spremenljivo hlapnost, jo zavijte v razred. To lahko enostavno storite z ustvarjanjem razreda ovitka, kot je prikazano v spodnjem delčku kode.

javni razred VolatileDoubleDemo

{

private volatile WrappedVolatileDouble volatileData;

}

javni razred WrappedVolatileDouble

{

javni dvojni podatki {get; set; }

Vendar upoštevajte omejitve zgornjega primera kode. Čeprav bi imeli najnovejšo vrednost volatileData referenčnega kazalca, najnovejša vrednost datoteke Podatki lastnine. Za to se je treba potruditi WrappedVolatileDouble tip nespremenljiv.

Kljub temu, da vam je volatilna ključna beseda v določenih situacijah lahko v pomoč pri varnosti niti, ni rešitev za vse težave s sočasnostjo niti. Morali bi vedeti, da označevanje spremenljivke ali predmeta kot spremenljivega še ne pomeni, da vam ni treba uporabljati ključne besede lock. Hlapljiva ključna beseda ne nadomešča ključne besede lock. Služba vam pomaga izogniti se navzkrižju podatkov, če imate več niti, ki poskušajo dostopati do istih podatkov.

$config[zx-auto] not found$config[zx-overlay] not found