Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 4864|Svar: 4

[Källa] 【Turn】C# multitrådad samtidighet under olika lås

[Kopiera länk]
Publicerad den 2023-4-13 18:44:49 | | | |
Under normala omständigheter, så länge multitrådad programmering är involverad, kommer programmets komplexitet att öka avsevärt, prestandan att minska avsevärt och sannolikheten för buggar att öka avsevärt.

Multitrådad programmering är avsedd att köra ett program parallellt för att förbättra databehandlingskapaciteten, men i de flesta fall innebär det konkurrens om delade resurser, så det måste låsas vid modifiering av resursobjekt. Det finns dock många sätt att implementera lås, så låt oss titta på implementeringen och prestandan hos flera typer av lås i C#.

Flera sätt att använda lås på

1. Atomlås

Uppnå "låslös" konkurrens genom atomoperationen Interlocked.CompareExchange.

Den officiella förklaringen är att tillhandahålla atomära operationer för variabler som delas av flera trådar. Namnrymd: System.Threading

2. Kritiskt område

Serialisering av flera trådar för att få tillgång till offentliga resurser eller en kodbit är snabbt och lämpligt för att kontrollera dataåtkomst. Låssyntaxen i C# är ett syntaxsocker för det kritiska området (Monitor).

3. Atomär drift

Atomära operationer, som är ett specialfall, är i grunden trådsäkra, så det finns inget behov av att låsa dem.

Officiellt tolkas det som att öka värdet av en given variabel i form av en atomär operation och lagra resultatet. Namnrymd: System.Threading

4. Läs och skriv lås

Läs-skriv-lås tillåter att resurser läses när andra program skriver, så om resursen tillåter smutsiga läsningar är detta mer lämpligt.

Den officiella förklaringen anger ett låst tillstånd som används för att hantera resursåtkomst, vilket möjliggör flertrådade läsningar eller exklusiv skrivåtkomst. Namnrymden är System.Threading

5. Semafor

Semaforer, designade för att kontrollera ett begränsat antal användarresurser.

Den officiella förklaringen begränsar antalet trådar som kan komma åt en resurs eller resurspool samtidigt. Namnrymden är System.Threading

6. Evenemang

Används för att meddela tråden att vissa händelser har inträffat, vilket startar starten av en efterföljande uppgift.

Den officiella förklaringen säger att trådsynkroniseringshändelser automatiskt återställs när en signal tas emot efter att en tråd släppts. Sådana typer kan inte ärvas.

7. Ömsesidig uteslutning

Det finns en Mutex-klass i C#, precis under System.Threading-namnrymden, Mutex är faktiskt en mutex, som inte bara kan hantera resurskonkurrens mellan flera trådar, utan även hantera resurskonkurrens mellan processer.


Prestandatestkod

Kör koden

Resultat från prestandatestet



Observera: Ovanstående data är endast resultatet av hårdvaruprestandan i den aktuella testmiljön och kan endast jämföras med varandra.

1) I olika tester är det definitivt snabbast att inte låsa, så försök undvika resurskonkurrens som leder till låst drift.

2) Interlocked.CompareExchange visar konsekvent överlägsen prestanda vid multitrådning och rankas som tvåa.

3) Det tredje låset, den kritiska zonen, visar också god prestanda, så vänligen motberätta, att andra säger att låsets prestanda är låg.

4) Den fjärde platsen är atomvariabel (atom) operation, men för närvarande stödjer den endast självökning och subtraktion av variabler, och tillämpligheten är inte stark.

5) Prestandan hos det femte läs-/skrivlåset (ReaderWriterLockSlim) är också okej, och det stöder att inte läsa något, och praktiskheten är fortfarande relativt god.

6) De återstående semaforerna, händelserna och mutexen har sämst prestanda, de har förstås sitt eget användningsområde, men de presterar inte bra när det gäller resurskonkurrens.

Ursprunglig länkadress:Inloggningen med hyperlänken är synlig.





Föregående:ASP.NET Core (16) Beroende av injektion av dynamiska registreringstjänster
Nästa:Soft route OpenWrt startas via ett USB-minne
 Hyresvärd| Publicerad den 2023-4-13 18:46:52 |
C#-program tillåter bara en instans att köra korrekt kod
https://www.itsvse.com/thread-3391-1-1.html

Skillnaden mellan ManualResetEvent och AutoResetEvent lärd sig av C#-trådar
https://www.itsvse.com/thread-4810-1-1.html

[Verklig strid]. NET/C# använder SemaphoreSlim för att begränsa samtidiga exekveringsmetoder
https://www.itsvse.com/thread-10259-1-1.html

C# Läs/skriv lås ReaderWriterLockSlim-användning
https://www.itsvse.com/thread-3545-1-1.html

.net/c# Användaren multitrådad samtidighetslås(sträng){...} Detaljerad förklaring
https://www.itsvse.com/thread-7764-1-1.html
Publicerad den 2023-4-13 19:21:44 |
Lär dig lite...
Publicerad den 2023-5-16 20:03:52 |
Lär dig lite...
Publicerad den 2023-5-19 11:41:25 |
Lär dig att lära dig
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com