Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 4864|Vastaus: 4

[Lähde] 【Turn】C# monisäikeinen rinnakkaistus eri lukkojen alla

[Kopioi linkki]
Julkaistu 2023-4-13 klo 18:44:49 | | | |
Normaaleissa olosuhteissa, kun kyseessä on monisäikeinen ohjelmointi, ohjelman monimutkaisuus kasvaa merkittävästi, suorituskyky heikkenee merkittävästi ja bugien todennäköisyys kasvaa huomattavasti.

Monisäikeinen ohjelmointi on tarkoitettu ajamaan ohjelmaa rinnakkain datankäsittelykykyjen parantamiseksi, mutta useimmissa tapauksissa se vaatii kilpailua jaetuista resursseista, joten se on lukittava resurssiobjekteja muokatessa. Kuitenkin lukkoja voi toteuttaa monin tavoin, joten tarkastellaanpa useiden lukkotyyppien toteutusta ja suorituskykyä C#:ssa.

Useita tapoja käyttää lukkoja

1. Atomilukko

Saavuta "lukiton" kilpailu atomioperaation Interlocked.CompareExchange-toiminnon kautta.

Virallinen selitys on tarjota atomisia operaatioita muuttujille, joita jakavat useat säikeet. Nimiavaruus: System.Threading

2. Kriittinen alue

Useiden säikeiden sarjoittaminen julkisten resurssien tai koodinpätkän saamiseksi on nopeaa ja sopivaa tiedon hallintaan. Lukkosyntaksi C#:ssa on syntaksisokeri kriittiselle alueelle (Monitor).

3. Atomitoiminta

Atomioperaatiot, jotka ovat erityistapaus, ovat luonteeltaan säiketurvallisia, joten niitä ei tarvitse lukita.

Virallisesti tulkitaan siten, että annetun muuttujan arvoa lisätään atomioperaationa ja tallennetaan tulos. Nimiavaruus: System.Threading

4. Lue ja kirjoita lukko

Luku-kirjoituslukot mahdollistavat resurssien lukemisen, kun muut ohjelmat kirjoittavat, joten jos resurssi sallii likaiset lukemiset, tämä on sopivampaa.

Virallinen selitys viittaa lukittuun tilaan, jota käytetään resurssien käytön hallintaan, mahdollistaen monisäikeisen lukemisen tai yksinoikeudella kirjoitusoikeuden. Nimiavaruus on System.Threading

5. Semafori

Semaforit, jotka on suunniteltu hallitsemaan rajoitettua määrää käyttäjäresursseja.

Virallinen selitys rajoittaa säikeiden määrää, jotka voivat käyttää resurssi- tai resurssipoolia samanaikaisesti. Nimiavaruus on System.Threading

6. Tapahtumat

Sitä käytetään ilmoittamaan säikeelle, että jokin tapahtuma on tapahtunut, aloittaen seuraajatehtävän alun.

Virallinen selitys sanoo, että säikeiden synkronointitapahtumat nollautuvat automaattisesti, kun signaali vastaanotetaan säikeen vapautuksen jälkeen. Tällaisia tyyppejä ei voi periä.

7. Molemminpuolinen poissulkeminen

C#:ssa on Mutex-luokka, aivan System.Threading-nimiavaruuden alla, Mutex on itse asiassa mutex, joka ei ainoastaan käsittele resurssikilpailua useiden säikeiden välillä, vaan myös resurssikilpailua prosessien välillä.


Suorituskykytestikoodi

Aja koodi

Suorituskykytestitulokset



Huomautus: Yllä olevat tiedot ovat vain nykyisen testiympäristön laitteistosuorituskyvyn tulosta, ja niitä voidaan verrata vain keskenään.

1) Erilaisissa testeissä se on ehdottomasti nopein tapa estää lukkiutumista, joten yritä välttää resurssikilpailua, joka johtaa lukittuun toimintaan.

2) Interlocked.CompareExchange osoittaa johdonmukaisesti erinomaista suorituskykyä monisäikeisessä käytössä, sijoittuen toiseksi.

3) Kolmas lukko, kriittinen alue, osoittaa myös hyvää suorituskykyä, joten kiistäkää muut, jos he sanovat, että lukon suorituskyky on heikko.

4) Neljäs sija on atomimuuttujan (atomi) operaatio, mutta tällä hetkellä se tukee vain muuttujien itsekasvua ja vähennystä, eikä soveltuvuus ole vahva.

5) Viidennen luku-/kirjoituslukon (ReaderWriterLockSlim) suorituskyky on myös kohtuullinen, ja se tukee lukemattomuutta, ja käytännöllisyys on edelleen suhteellisen hyvä.

6) Jäljelle jääneet semaforit, tapahtumat ja mutex ovat heikoimman suorituskyvyn, tietenkin niillä on oma sovellusalueensa, mutta ne eivät pärjää hyvin resurssikilpailussa.

Alkuperäinen linkkiosoite:Hyperlinkin kirjautuminen on näkyvissä.





Edellinen:ASP.NET Core (16) Riippuvainen dynaamisten rekisteröintipalveluiden injektioinnista
Seuraava:Soft route OpenWrt alkaa pyöriä USB-tikun kautta
 Vuokraisäntä| Julkaistu 2023-4-13 klo 18:46:52 |
C#-ohjelmat sallivat vain yhden instanssin suorittaa oikean koodin
https://www.itsvse.com/thread-3391-1-1.html

Ero ManualResetEventin ja AutoResetEventin välillä oppii C#-säikeistä
https://www.itsvse.com/thread-4810-1-1.html

[Varsinaista taistelua]. NET/C# käyttää SemaphoreSlimiä rajoittaakseen samanaikaisia suoritusmenetelmiä
https://www.itsvse.com/thread-10259-1-1.html

C# Luku/Kirjoita Lukija Kirjoittaja Lukija Slim käyttö
https://www.itsvse.com/thread-3545-1-1.html

.net/c# Käyttäjä monisäikeinen rinnakkaisluku (merkkijono){...} Yksityiskohtainen selitys
https://www.itsvse.com/thread-7764-1-1.html
Julkaistu 2023-4-13 klo 19:21:44 |
Opiskele vähän...
Julkaistu 2023-5-16 klo 20:03:52 |
Opiskele vähän...
Julkaistu 2023-5-19 klo 11:41:25 |
Opettele oppimaan
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com