Programavimas

Mano du centai „SpinLock“ .Net

Įsivaizduokite situaciją, kai gija bando įgyti prieigą prie bendro šaltinio, bet išteklius jau užrakintas, todėl gija turi laukti, kol užraktas bus atleistas. Štai kur prasideda siūlų sinchronizavimas. Siūlų sinchronizavimas naudojamas siekiant užkirsti kelią kelioms gijoms vienu metu pasiekti bendrą išteklių. „Microsoft .Net Framework“ palaiko įvairius sinchronizavimo pradmenis, kurie gali būti naudojami gijų elgsenai valdyti ir lenktynių sąlygoms išvengti. „Mutex“ ir „Spinlock“ yra du populiarūs sinchronizavimo mechanizmai, naudojami sinchronizuoti prieigą prie bendro šaltinio.

„SpinLock“ yra alternatyva sinchronizavimo blokavimui. „SpinLock“ (taip pat žinomas kaip „Užimtas laukimas“) yra mechanizmas, kurį naudojant galima priversti giją bandyti užrakto laukti, kol jis galės pasiekti šaltinį. Atminkite, kad „SpinLock“ gali veikti greičiau, palyginti su „Mutex“, nes sumažėja konteksto perjungimas. Tačiau „SpinLocks“ turėtumėte naudoti tik tuo atveju, jei kritinis skyrius turėtų atlikti minimalų darbų kiekį, t.y., „SpinLock“ yra laikomas labai trumpą laiką. „SpinLocks“ dažniausiai teikiama pirmenybė simetriškose daugiaprocesorinėse sistemose, kad būtų nuolat apklausta, ar yra išteklių vietoj kontekstinių jungiklių.

Kas yra „SpinLock“ ir kodėl jis reikalingas?

„SpinLock“ atlieka įtemptą laukimą ir gali pasiūlyti geresnį našumą, kai naudojamas daugiagyslėse sistemose, ypač kai pigu laukti cikle ir kaupti išteklius, o ne blokuoti. Tai ypač naudinga, kai užrakto sulaikymo laikas yra trumpas. Kitaip tariant, galite pasinaudoti „SpinLock“ pranašumais daugiagyslėse sistemose, kad sumažintumėte pridėtines išlaidas, susijusias su konteksto perjungimu, jei laikas, praleistas kritiniame skyriuje, yra mažas. Kritinė sekcija gali būti apibrėžiama kaip duomenų struktūra arba išteklius, kuriuos bendrina kelios gijos, tačiau viena ir tik viena gija gali turėti prieigą prie jos bet kuriuo konkrečiu momentu.

Reikėtų pažymėti, kad ilgiau laikant „SpinLock“ būtų paprasčiausiai švaistomi sistemos ištekliai ir kenkiama programos veikimui. Iš esmės, jei manote, kad blokavimas bus reikšmingas, „SpinLock“ niekada nereikėtų naudoti - „SpinLock“ naudokite tik tada, kai užrakto sulaikymo laikas yra pakankamai mažas.

„SpinLock“ paprastai naudojami dirbant su pertraukomis, norint atlikti užimtą laukimą ciklo metu, kol bus prieinamas išteklius. „SpinLock“ nesukelia gijos iš anksto, greičiau ji sukasi tol, kol bus atlaisvinta šaltinio užraktas.

„SpinLock“ programavimas .Net

Atminkite, kad „SpinLock“ yra apibrėžiama kaip „.Net“ struktūra, t. Y. Ji yra apibrėžta kaip vertės tipas dėl našumo priežasčių. Taigi, jei einate aplink „SpinLock“ egzempliorių, turėtumėte jį perduoti pagal nuorodą, o ne pagal vertę. Šiame skyriuje mes ištirsime, kaip galime programuoti „SpinLock“ .Net. Norėdami įdiegti „SpinLock“ .Net, turėtumėte pasinaudoti sistemos „SpinLock“ pranašumais. Vardų srities gija.

Šis kodų sąrašas parodo, kaip galite naudoti „SpinLock“ .Net.

„SpinLock“ spinLock = naujas „SpinLock“ (tiesa);

bool isLocked = klaidingas;

bandyti

{

spinLock.Enter (nuoroda užrakinta);

// Čia parašykite įprastą kodą

}

pagaliau

{

jei (yra užrakinta)

spinLock.Exit ();

}

„SpinWait“

Atkreipkite dėmesį, kad kaip ir „SpinLock“, „SpinWait“ taip pat yra struktūra, o ne klasė. Panašiai kaip „SpinLock“, galite naudoti „SpinWait“, kad parašytumėte nemokamą užrakto sinchronizavimo kodą, kuris gali „sukti“, o ne blokuoti. „SpinWait“ gali būti naudojamas siekiant sumažinti išteklių sunaudojimą atliekant intensyvų procesoriaus sukimąsi 10 kartojimų įrašams, kuriuos valdys paskambinę „Thread.Yield“ ir „Thread.Sleep“. Kitaip tariant, „SpinWait“ gali būti naudojamas norint apriboti intensyvų procesoriaus sukimąsi iki fiksuoto pakartojimų skaičiaus. MSDN teigia: "System.Threading.SpinWait yra lengvas sinchronizavimo tipas, kurį galite naudoti žemo lygio scenarijuose, kad išvengtumėte brangių konteksto jungiklių ir branduolio perėjimų, kurie reikalingi branduolio įvykiams."

Norėdami naudoti „SpinWait“ savo kode, galite pasinaudoti „SpinWait“ struktūros „SpinUntil (“) statiniu metodu arba pasinaudoti jo „Statin SpinOnce“ () statiniu metodu. Šis kodo fragmentas parodo, kaip galima naudoti „SpinWait“.

„SpinWait“ spinWait = naujas „SpinWait“ ();

bool shouldSpin;

kol (! shouldSpin)

{

Siūlai.MemoryBarrier (); spinWait.SpinOnce ();

}

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