V običajnih okoliščinah, dokler je vključeno večnitno programiranje, se kompleksnost programa znatno poveča, zmogljivost se znatno zmanjša, verjetnost napak pa se močno poveča.
Večnitno programiranje je namenjeno paralelnemu izvajanju programa za izboljšanje zmogljivosti obdelave podatkov, vendar v večini primerov vključuje tekmovanje za skupne vire, zato ga je treba zakleniti pri spreminjanju objektov virov. Vendar obstaja veliko načinov za implementacijo zaklepov, zato si poglejmo implementacijo in zmogljivost več vrst zaklepov v C#.
Več načinov uporabe ključavnic
1. Atomska ključavnica
Doseči tekmovanje "brez zaklepanja" preko atomske operacije Interlocked.CompareExchange.
Uradna razlaga je zagotoviti atomske operacije za spremenljivke, ki jih deli več niti. Imenski prostor: System.Threading
2. Kritično območje
Serializacija več niti za dostop do javnih virov ali kode je hitra in primerna za nadzor dostopa do podatkov. Zaklepna sintaksa v C# je sintaktični sladkor za kritično območje (Monitor).
3. Atomsko delovanje
Atomske operacije, ki so poseben primer, so po naravi niti varne, zato jih ni treba zaklepati.
Uradno se razlaga kot povečanje vrednosti določene spremenljivke v obliki atomske operacije in shranjevanje rezultata. Imenski prostor: System.Threading
4. Zaklep za branje in pisanje
Zaklepi za branje in pisanje omogočajo branje virov, ko drugi programi pišejo, zato je to bolj primerno, če vir dovoljuje umazane branja.
Uradna razlaga navaja zaklenjeno stanje, ki se uporablja za upravljanje dostopa do virov, kar omogoča večnitno branje ali ekskluzivni dostop do pisanja. Imenski prostor je System.Threading
5. Semafor
Semaforji, zasnovani za nadzor omejenega števila uporabniških virov.
Uradna razlaga omejuje število niti, ki lahko hkrati dostopajo do vira ali bazena virov. Imenski prostor je System.Threading
6. Dogodki
Uporablja se za obveščanje niti, da so se zgodili nekateri dogodki, s čimer se začne nasledstvena naloga.
Uradna razlaga navaja, da se dogodki sinhronizacije niti samodejno ponastavijo, ko je signal sprejet po sprostitvi niti. Takšnih vrst ni mogoče dedovati.
7. Medsebojna izključitev
V C# obstaja razred Mutex, tik pod imenskim prostorom System.Threading, Mutex je pravzaprav mutex, ki ne more le reševati konkurenco virov med več nitmi, ampak tudi konkurenco virov med procesi.
Koda za testiranje zmogljivosti
Zaženi kodo
Rezultati testiranja zmogljivosti
Opomba: Zgornji podatki so le rezultat strojne zmogljivosti trenutnega testnega okolja in jih je mogoče primerjati le med seboj.
1) V različnih testih je zagotovo najhitrejša možnost, da se ne zaklene, zato se izogibajte tekmovanju virov, ki vodi v zaklenjeno delovanje.
2) Prepleteno.CompareExchange dosledno kaže boljše rezultate v večnitnem delovanju in je na drugem mestu.
3) Tretja ključavnica, kritična cona, prav tako kaže dobro zmogljivost, zato prosim zavrnite druge, ko pravijo, da je zaklep nizek.
4) Četrto mesto je delovanje atomske spremenljivke (atomske), vendar trenutno podpira le samopovečevanje in odštevanje spremenljivk, pri čemer uporabnost ni močna.
5) Uspešnost petega zaklepa za branje/pisanje (ReaderWriterLockSlim) je prav tako v redu, podpira branje ničesar, praktičnost pa je še vedno razmeroma dobra.
6) Preostali semaforji, dogodki in mutex imajo seveda najslabšo učinkovitost, imajo svoje področje uporabe, vendar se ne obnesejo dobro pri konkurenci za vire.
Izvirni naslov povezave:Prijava do hiperpovezave je vidna.
|