Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 4864|Atsakyti: 4

[Šaltinis] 【Pasukti】 C# kelių gijų sutapimas po įvairiomis spynomis

[Kopijuoti nuorodą]
Paskelbta 2023-4-13 18:44:49 | | | |
Į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.





Ankstesnis:ASP.NET Core (16) Priklauso nuo dinaminės registracijos paslaugų įvedimo
Kitą:Minkštas maršrutas OpenWrt pradedamas veikti per USB atmintinę
 Savininkas| Publikuota: 2023-4-13 18:46:52 |
C# programos leidžia tik vienam egzemplioriui paleisti teisingą kodą
https://www.itsvse.com/thread-3391-1-1.html

Skirtumas tarp "ManualResetEvent" ir "AutoResetEvent", išmoktas iš C# gijų
https://www.itsvse.com/thread-4810-1-1.html

[Tikroji kova]. NET/C# naudoja SemaphoreSlim, kad apribotų lygiagrečius vykdymo metodus
https://www.itsvse.com/thread-10259-1-1.html

C# skaitymo / rašymo užraktas ReaderWriterLockSlim naudojimas
https://www.itsvse.com/thread-3545-1-1.html

.net/c# Vartotojo kelių gijų sutapimo užraktas (eilutė){...} Išsamus paaiškinimas
https://www.itsvse.com/thread-7764-1-1.html
Publikuota: 2023-4-13 19:21:44 |
Sužinokite šiek tiek...
Publikuota: 2023-5-16 20:03:52 |
Sužinokite šiek tiek...
Publikuota: 2023-5-19 11:41:25 |
Išmokite mokytis
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com