Įprastomis aplinkybėmis, kol bus programuojamas kelių gijų, programos sudėtingumas žymiai padidės, našumas žymiai sumažės, o klaidų tikimybė labai padidės.
Daugiagijų programavimas skirtas lygiagrečiai paleisti programą, siekiant pagerinti duomenų apdorojimo galimybes, tačiau daugeliu atvejų jis susijęs su konkurencija dėl bendrų išteklių, todėl keičiant išteklių objektus jis turi būti užrakintas. Tačiau yra daug būdų, kaip įdiegti spynas, todėl pažvelkime į kelių tipų spynų diegimą ir veikimą C#.
Keli spynų naudojimo būdai
1. Atominis užraktas
Pasiekite "neužrakintą" konkurenciją per atominę operaciją Interlocked.CompareExchange.
Oficialus paaiškinimas yra pateikti atomines operacijas kintamiesiems, kuriuos dalijasi kelios gijos. Vardų sritis: System.Threading
2. Kritinė sritis
Kelių gijų serializavimas, kad būtų galima pasiekti viešuosius išteklius ar kodo dalį, yra greitas ir tinkamas prieigai prie duomenų valdyti. C# užrakto sintaksė yra kritinės srities (monitoriaus) sintaksė.
3. Atominė operacija
Atominės operacijos, kurios yra ypatingas atvejis, iš prigimties yra saugios sriegiams, todėl jų užrakinti nereikia.
Oficialiai aiškinama kaip tam tikro kintamojo vertės didinimas atominės operacijos forma ir rezultato saugojimas. Vardų sritis: System.Threading
4. Skaitymo ir rašymo užraktas
Skaitymo-rašymo užraktai leidžia skaityti išteklius, kai rašo kitos programos, taigi, jei išteklius leidžia nešvarius skaitymus, tai yra tinkamiau.
Oficialiame paaiškinime nurodoma užrakinta būsena, naudojama išteklių prieigai valdyti, įgalinant kelių gijų skaitymą arba išskirtinę rašymo prieigą. Vardų sritis yra System.Threading
5. Semaforas
Semaforai, skirti valdyti ribotą vartotojų išteklių skaičių.
Oficialus paaiškinimas riboja gijų, galinčių pasiekti išteklius ar išteklių telkinį vienu metu, skaičių. Vardų sritis yra System.Threading
6. Renginiai
Naudojamas pranešti gijai, kad įvyko tam tikri įvykiai, pradedant vėlesnės užduoties pradžią.
Oficialiame paaiškinime teigiama, kad gijų sinchronizavimo įvykiai automatiškai nustatomi iš naujo, kai gaunamas signalas po gijos išleidimo. Tokių tipų negalima paveldėti.
7. Abipusė atskirtis
C# yra Mutex klasė, tik po System.Threading vardų sritimi, Mutex iš tikrųjų yra mutex, kuris gali ne tik susidoroti su išteklių konkurencija tarp kelių gijų, bet ir valdyti išteklių konkurenciją tarp procesų.
Našumo testo kodas
Paleiskite kodą
Našumo testo rezultatai
Pastaba: Aukščiau pateikti duomenys yra tik dabartinės bandymo aplinkos aparatinės įrangos našumo rezultatas ir gali būti lyginami tik tarpusavyje.
1) Atliekant įvairius bandymus, tai tikrai greičiausias neužrakinimas, todėl stenkitės išvengti išteklių konkurencijos, kuri veda prie užrakinto veikimo.
2) Interlocked.CompareExchange nuolat rodo puikų našumą kelių gijų srityje, užimdamas antrą vietą.
3) Trečiasis užraktas, kritinė zona taip pat rodo gerą našumą, todėl prašome paneigti kitus, kai jie sako, kad užrakto našumas yra žemas.
4) Ketvirtoji vieta yra atominis kintamasis (atominis) veikimas, tačiau šiuo metu jis palaiko tik kintamųjų savaiminį didinimą ir atėmimą, o pritaikomumas nėra stiprus.
5) Penktojo skaitymo / rašymo užrakto (ReaderWriterLockSlim) našumas taip pat yra gerai, ir jis palaiko nieko neskaitymą, o praktiškumas vis dar yra gana geras.
6) Likę semaforai, įvykiai ir muteksai turi prasčiausią našumą, žinoma, jie turi savo taikymo sritį, tačiau jie negerai veikia sprendžiant išteklių konkurenciją.
Pradinis nuorodos adresas:Hipersaito prisijungimas matomas.
|