Programiranje

Najboljši postopki za sinhronizacijo niti .Net

Sinhronizacija je koncept, ki se uporablja za preprečevanje hkratnega dostopa več niti do vira v skupni rabi. Z njim lahko preprečite, da bi več niti istočasno priklicalo lastnosti ali metode predmeta. Vse, kar morate storiti, je sinhronizirati blok kode, ki dostopa do vira v skupni rabi, ali sinhronizirati klice na lastnosti in člane predmeta, tako da lahko v danem trenutku v kritični odsek vstopi samo ena nit.

Ta članek predstavlja razpravo o konceptih, povezanih s sinhronizacijo in varnostjo niti v .Netu, ter o najboljših praksah.

Ekskluzivna ključavnica

Ekskluzivno zaklepanje se uporablja za zagotovitev, da lahko v danem trenutku ena in samo ena nit vstopi v kritični odsek. Za uporabo ekskluzivnih ključavnic v svoji aplikaciji morate uporabiti eno od naslednjih.

  • Zakleni - to je skladenjska bližnjica za statične metode razreda Monitor in se uporablja za pridobitev ekskluzivne ključavnice vira v skupni rabi
  • Mutex - podobno kot ključna beseda lock, le da lahko deluje v več procesih
  • SpinLock - uporablja se za pridobivanje ekskluzivne ključavnice vira v skupni rabi, tako da se izogne ​​previsokemu preklopu konteksta niti

Za izvajanje varnosti niti v svojih aplikacijah lahko uporabite statične metode razreda Monitor ali ključno besedo lock. Statične člane razreda Monitor in ključne besede lock lahko uporabite za preprečevanje sočasnega dostopa do vira v skupni rabi. Ključna beseda lock je le bližnjica za izvajanje sinhronizacije. Kadar pa morate v večnitni aplikaciji izvajati zapletene operacije, sta lahko uporabni metodi Wait () in Pulse () razreda Monitor.

Naslednji delček kode prikazuje, kako lahko izvedete sinhronizacijo z uporabo razreda Monitor.

zasebni statični objekt samo za branje lockObj = nov objekt ();

       statična praznina Main (string [] args)

        {

Monitor.Enter (lockObj);

                       poskusite

            {

// Nekaj ​​kode

            }

            končno

            {

Monitor.Exit (lockObj);

            }

        }

Enakovredna koda, ki uporablja ključno besedo lock, bo videti podobno tej:

    zasebni statični objekt samo za branje lockObj = nov objekt ();

statična praznina Main (string [] args)

        {  

poskusite

            {

zaklepanje (lockObj)

                {

// Nekaj ​​kode

                }             

            }

končno

            {

// Tu lahko sprostite vse vire

            }

        }

Razred Mutex lahko izkoristite za izvajanje sinhronizacije, ki se lahko razteza med različnimi procesi. Upoštevajte, da se podobno kot izjava za zaklepanje lahko tudi ključavnica, ki jo je pridobil Mutex, sprosti samo iz iste niti, ki je bila uporabljena za zaklepanje. Pridobivanje in sproščanje ključavnic z uporabo Mutexa je sorazmerno počasnejše, kot če bi to storili z uporabo stavka lock.

Glavna ideja SpinLock-a je zmanjšati stroške, povezane s preklopom konteksta med nitmi - če lahko nit nekaj časa čaka ali se vrti, dokler ne zaklene vira v skupni rabi, se lahko izognemo režijskim stroškom, vključenim v preklop konteksta med nitmi . Ko kritični del opravi minimalno količino dela, je lahko dober kandidat za SpinLock.

Neekskluzivna ključavnica

Neekskluzivno zaklepanje lahko izkoristite za omejitev sočasnosti. Za namestitev neizključnih ključavnic lahko uporabite eno od naslednjega.

  • Semafor - uporablja se za omejevanje števila niti, ki imajo lahko hkrati dostop do vira v skupni rabi. V bistvu se hkrati uporablja za omejevanje števila potrošnikov za določen deljeni vir.
  • SemaphoreSlim - hitra, lahka alternativa razredu Semaphore za uporabo neizključnih ključavnic.
  • ReaderWriterLockSlim - razred ReaderWriterLockSlim je bil uveden v .Net Framework 3.5 kot zamenjava razreda ReaderWriterLock.

Razred ReaderWriterLockSlim lahko uporabite za pridobitev neizključne ključavnice vira v skupni rabi, ki bi potreboval pogosta branja, vendar redke posodobitve. Namesto vzajemno izključujočega zaklepanja vira v skupni rabi, ki potrebuje pogosta branja in redke posodobitve, lahko s tem razredom pridobite zaklepanje branja v skupnem viru in izključno zaklepanje pisanja na njem.

Zastoji

Izogibajte se uporabi stavka zaklepanja za tip ali stavkov, kot je lock (this), za izvajanje sinhronizacije v vaši aplikaciji, saj bi to lahko povzročilo blokade. Upoštevajte, da lahko pride do zastojev tudi, če dlje časa držite ključavnico, pridobljeno na viru v skupni rabi. V izjavah o zaklepanju ne smete uporabljati nespremenljivih vrst. Kot primer se izogibajte uporabi predmeta niza kot ključa v izjavi za zaklepanje. Izogibajte se uporabi stavka lock na javnem tipu - dobra praksa je zaklepanje zasebnih ali zaščitenih predmetov, ki niso internirani. V bistvu pride do blokade, ko več niti čaka, da se sprosti zaklepanje vira v skupni rabi. Če želite izvedeti več o mrtvih točkah, se lahko obrnete na ta članek MSDN.

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