Ohjelmointi

Kaksi senttiäni SpinLockissa .Netissä

Kuvittele tilanne, jossa ketju yrittää hankkia pääsyn jaettuun resurssiin, mutta resurssi on jo lukittu, joten langan on odotettava, kunnes lukitus vapautetaan. Tässä ketjun synkronointi tulee pelaamaan. Kierteen synkronointia käytetään estämään useita ketjuja pääsemästä jaettuun resurssiin samanaikaisesti. Microsoft .Net Framework tarjoaa tukea useille synkronointiprimitiiveille, joita voidaan käyttää langankäyttäytymisen hallintaan ja kilpailuolosuhteiden välttämiseen. Mutex ja Spinlock ovat kaksi suosittua synkronointimekanismia, joita käytetään jaetun resurssin pääsyn synkronointiin.

SpinLock on vaihtoehto synkronoinnin estämiselle. SpinLock (tunnetaan myös nimellä "varattu odotus") on mekanismi, jota voidaan käyttää langan yrittämiseen hankkia lukko odottamaan silmukassa, kunnes se saa pääsyn resurssiin. Huomaa, että SpinLock voi toimia nopeammin kuin Mutex, koska kontekstivaihto on vähäistä. SpinLocksia tulisi kuitenkin käyttää vain, jos kriittisen osan oletetaan tekevän vähän työtä, ts. SpinLockia pidetään hyvin lyhyen aikaa. SpinLockit ovat yleensä suositeltavia symmetrisissä moniprosessorijärjestelmissä kyselemään jatkuvasti resurssin saatavuutta kontekstikytkinten sijasta.

Mikä SpinLock on ja miksi sitä tarvitaan?

SpinLock suorittaa kiireisen odottamisen ja voi tarjota parempaa suorituskykyä, kun sitä käytetään moniydinsysteemeissä, varsinkin kun on halpaa odottaa silmukassa ja yhdistää resurssi eikä estää sitä. Tämä on erityisen hyödyllistä, kun lukon pitoaika on lyhyt. Toisin sanoen, voit hyödyntää SpinLockia moniydinsysteemeissä vähentääksesi kontekstinvaihtoon liittyviä kustannuksia, jos kriittisen osan sisällä vietettävä aika on pieni. Kriittinen osa voidaan määritellä tietorakenteeksi tai resurssiksi, jonka useat ketjut jakavat, mutta yhdellä ja vain yhdellä säikeellä voi olla pääsy siihen milloin tahansa.

On huomattava, että SpinLockin pitäminen pidempään olisi yksinkertaisesti järjestelmän resurssien tuhlausta ja haitallista sovelluksen suorituskyvylle. Pohjimmiltaan, jos oletat, että estolla on merkittävä kesto, SpinLockia ei saa koskaan käyttää - käytä SpinLockia vain, kun lukituksen pitoaika on kohtuullisen lyhyt.

SpinLockia käytetään tyypillisesti keskeytysten kanssa työskenneltäessä kiireisen odottamisen suorittamiseksi silmukan sisällä, kunnes resurssi on käytettävissä. SpinLock ei aiheuta langan ennakointia, vaan jatkaa pyörimistä, kunnes resurssin lukitus vapautetaan.

SpinLockin ohjelmointi

Huomaa, että SpinLock määritellään rakenteeksi .Netissä, ts. Se määritellään arvotyypiksi suorituskyvyn vuoksi. Jos siis ohitat SpinLock-ilmentymän, sinun on välitettävä se viitteellä eikä arvolla. Tässä osassa tutkitaan, miten voimme ohjelmoida SpinLockin .Net-tiedostoon. SpinLockin käyttöönottamiseksi .Netissä sinun on hyödynnettävä System.Threading-nimiavaruudessa olevaa SpinLock-luokkaa.

Seuraava koodiluettelo näyttää kuinka voit käyttää SpinLockia .Netissä.

SpinLock spinLock = uusi SpinLock (true);

bool isLocked = epätosi;

yrittää

{

spinLock.Enter (viite on lukittu);

// Kirjoita tavallinen koodi tähän

}

lopulta

{

jos (on lukittu)

spinLock.Exit ();

}

SpinWait

Huomaa, että kuten SpinLock, SpinWait on myös rakenne eikä luokka. Samoin kuin SpinLock, voit käyttää SpinWaitia lukittoman synkronointikoodin kirjoittamiseen, joka voi "pyöriä" eikä estää. SpinWaitia voidaan käyttää resurssien kulutuksen vähentämiseen suorittamalla prosessorin intensiivinen kehräys 10 iterointiviestiä varten, jolloin se antaa hallinnan kutsumalla Thread.Yield ja Thread.Sleep. Toisin sanoen SpinWaitia voidaan käyttää suorittimen intensiivisen kehruun rajoittamiseen kiinteään määrään iteraatioita. MSDN: n mukaan "System.Threading.SpinWait on kevyt synkronointityyppi, jota voit käyttää matalan tason skenaarioissa välttääksesi kalliita kontekstikytkimiä ja ytimensiirtoja, joita tarvitaan ydintapahtumissa."

Jos haluat käyttää SpinWaitia koodissasi, voit joko hyödyntää SpinWait-rakenteen staattista SpinUntil () -menetelmää tai hyödyntää sen ei-staattista SpinOnce () -menetelmää. Seuraava koodinpätkä kuvaa SpinWaitin käyttöä.

SpinWait spinWait = uusi SpinWait ();

boolin pitäisiSpin;

kun (! shouldSpin)

{

Viestiketju.Muistineste (); spinWait.SpinOnce ();

}

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