See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 4864|Vastuse: 4

[Allikas] 【Turn】C# mitmelõimeline samaaegsus erinevate lukustuste all

[Kopeeri link]
Postitatud 2023-4-13 18:44:49 | | | |
Tavapärastes tingimustes, kui tegemist on mitmelõimelise programmeerimisega, suureneb programmi keerukus märkimisväärselt, jõudlus langeb märkimisväärselt ja vigade tõenäosus suureneb märkimisväärselt.

Mitmelõimeline programmeerimine on mõeldud programmi paralleelseks käivitamiseks, et parandada andmetöötlusvõimekust, kuid enamasti tähendab see konkurentsi jagatud ressursside pärast, mistõttu tuleb ressursiobjektide muutmisel see lukustada. Kuid lukkude rakendamiseks on palju erinevaid viise, seega vaatame C#-s mitme tüüpi lukkude rakendamist ja jõudlust.

Mitmed viisid lukkude kasutamiseks

1. Aatomilukk

Saavuta "lukustamata" konkurents tuumaoperatsiooni Interlocked.CompareExchange.

Ametlik seletus on pakkuda aatomilisi operatsioone muutujatele, mida jagavad mitmed lõimed. Nimeruum: System.Threading

2. Kriitiline piirkond

Mitme lõime seriaalistamine avalike ressursside või kooditüki ligipääsuks on kiire ja sobiv andmejuurdepääsu kontrollimiseks. Lukusüntaks C#-s on süntaksi suhkur kriitilise ala jaoks (Monitor).

3. Aatomitöö

Aatomioperatsioonid, mis on erandjuhtum, on olemuslikult lõimekindlad, seega pole vaja neid lukustada.

Ametlikult tõlgendatakse seda kui antud muutuja väärtuse suurendamist aatomilise operatsioonina ja tulemuse salvestamist. Nimeruum: System.Threading

4. Loe ja kirjuta lukk

Lugemis-kirjutamise lukud võimaldavad ressursse lugeda, kui teised programmid kirjutavad, seega kui ressurss lubab räpaseid lugemisi, on see sobivam.

Ametlik selgitus viitab lukustatud olekule, mida kasutatakse ressursside ligipääsu haldamiseks, võimaldades mitmelõimelist lugemist või eksklusiivset kirjutamisõigust. Nimeruum on System.Threading

5. Semafor

Semaforid, mis on loodud piiratud arvu kasutajaressursside kontrollimiseks.

Ametlik selgitus piirab lõimede arvu, mis võivad samaaegselt ligi pääseda ressursile või ressursside kogumile. Nimeruum on System.Threading

6. Sündmused

Kasutatakse selleks, et teavitada lõime, et on toimunud mõningaid sündmusi, alustades järglasülesande algust.

Ametlik selgitus ütleb, et lõimede sünkroniseerimise sündmused lähtestuvad automaatselt, kui signaal saabub pärast lõime vabastamist. Selliseid tüüpe ei saa pärida.

7. Vastastikune välistamine

C# keeles on Mutex klass, otse System.Threading nimeruumi all, Mutex on tegelikult mutex, mis suudab mitte ainult lahendada ressursikonkurentsi mitme lõime vahel, vaid ka ressursikonkurentsi protsesside vahel.


Jõudlustesti kood

Käivita kood

Tulemustestide tulemused



Märkus: Ülaltoodud andmed põhinevad ainult praeguse testikeskkonna riistvara jõudluse tulemusel ning neid saab omavahel võrrelda.

1) Erinevates testides on see kindlasti kiireim, et mitte lukustada, seega püüa vältida ressursside konkurentsi, mis viib lukustatud tööni.

2) Interlocked. CompareExchange näitab järjepidevalt paremat jõudlust mitmelõimelises süsteemis, olles teisel kohal.

3) Kolmas lukk, kriitiline tsoon, näitab samuti head jõudlust, seega palun lükka teised ümber, kui nad väidavad, et lukustus on madal.

4) Neljas koht on aatommuutuja (aatomiline) operatsioon, kuid praegu toetab see ainult muutujate isekasvamist ja lahutamist ning rakendatavus ei ole tugev.

5) Viienda lugemise/kirjutamise luku (ReaderWriterLockSlim) jõudlus on samuti okei, toetab mitte midagi lugemist ja praktilisus on endiselt suhteliselt hea.

6) Ülejäänud semaforid, sündmused ja mutex on kehvema tulemusega, loomulikult on neil oma rakendusala, kuid nad ei toimi hästi ressursikonkurentsis.

Algne lingi aadress:Hüperlingi sisselogimine on nähtav.





Eelmine:ASP.NET Core (16) Sõltub dünaamiliste registreerimisteenuste süstimisest
Järgmine:Soft Route OpenWrt käivitatakse USB-mälupulga kaudu
 Üürileandja| Postitatud 2023-4-13 18:46:52 |
C# programmid lubavad ainult ühel instantsil õiget koodi käivitada
https://www.itsvse.com/thread-3391-1-1.html

ManualResetEventi ja AutoResetEventi, mida õpivad C# lõimed
https://www.itsvse.com/thread-4810-1-1.html

[Päris lahing]. NET/C# kasutab SemaphoreSlim'i samaaegsete täitmismeetodite piiramiseks
https://www.itsvse.com/thread-10259-1-1.html

C# Luge/Kirjuta Lukustus Lugeja Kirjutaja Luku Slim kasutus
https://www.itsvse.com/thread-3545-1-1.html

.net/c# Kasutaja mitmelõimeline samaaegsus lock(string){...} Üksikasjalik selgitus
https://www.itsvse.com/thread-7764-1-1.html
Postitatud 2023-4-13 19:21:44 |
Õpi natuke...
Postitatud 2023-5-16 20:03:52 |
Õpi natuke...
Postitatud 2023-5-19 11:41:25 |
Õpi õppima
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com