Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 4864|Antwoord: 4

[Bron] 【Turn】C# multithreaded concurrency onder verschillende locks

[Link kopiëren]
Geplaatst op 13-4-2023 18:44:49 | | | |
Onder normale omstandigheden, zolang er multithreaded programmeren betrokken is, neemt de complexiteit van het programma aanzienlijk toe, neemt de prestatie aanzienlijk af en neemt de kans op bugs sterk toe.

Multithreaded programmeren is bedoeld om een programma parallel uit te voeren om de gegevensverwerkingscapaciteiten te verbeteren, maar in de meeste gevallen gaat het gepaard met concurrentie om gedeelde resources, dus moet het worden vergrendeld bij het wijzigen van resourceobjecten. Er zijn echter veel manieren om locks te implementeren, dus laten we eens kijken naar de implementatie en prestaties van verschillende soorten locks in C#.

Verschillende manieren om sloten te gebruiken

1. Atomaire vergrendeling

Bereik "lockless" concurrentie via de atomaire operatie Interlocked.CompareExchange.

De officiële verklaring is om atomaire bewerkingen te bieden voor variabelen die door meerdere threads worden gedeeld. Naamruimte: System.Threading

2. Kritisch gebied

Serialisatie van meerdere threads om toegang te krijgen tot publieke bronnen of een stuk code is snel en geschikt voor het controleren van data-toegang. De slotsyntaxis in C# is een syntaxissuiker voor het kritieke gebied (Monitor).

3. Atomaire werking

Atomaire bewerkingen, die een speciaal geval zijn, zijn van nature thread-veilig, dus er is geen noodzaak om ze te vergrendelen.

Officieel geïnterpreteerd als het verhogen van de waarde van een gegeven variabele in de vorm van een atomaire bewerking en het opslaan van het resultaat. Naamruimte: System.Threading

4. Lees en schrijf slot

Lees-schrijf sloten maken het mogelijk om bronnen te lezen wanneer andere programma's schrijven, dus als de bron vuile leesopdrachten toestaat, is dit geschikter.

De officiële uitleg geeft een vergrendelde toestand aan die wordt gebruikt om resource-toegang te beheren, waardoor multithreaded reads of exclusieve schrijftoegang mogelijk zijn. De naamruimte is System.Threading

5. Semafoor

Semaforen, ontworpen om een beperkt aantal gebruikersbronnen te beheren.

De officiële verklaring beperkt het aantal threads dat tegelijkertijd toegang heeft tot een resource of resource pool. De naamruimte is System.Threading

6. Evenementen

Gebruikt om de thread te waarschuwen dat er gebeurtenissen zijn voorgekomen, waarmee het begin van een opvolgertaak begint.

De officiële uitleg stelt dat thread-synchronisatiegebeurtenissen automatisch worden gereset wanneer een signaal wordt ontvangen nadat een thread is vrijgegeven. Dergelijke types kunnen niet worden geërfd.

7. Wederzijdse uitsluiting

Er is een Mutex-klasse in C#, direct onder de System.Threading-naamruimte, Mutex is eigenlijk een mutex, die niet alleen kan omgaan met resourceconcurrentie tussen meerdere threads, maar ook resourceconcurrentie tussen processen.


Prestatietestcode

Voer de code uit

Resultaten van prestatietests



Opmerking: De bovenstaande gegevens zijn alleen het resultaat van de hardwareprestaties van de huidige testomgeving en kunnen alleen met elkaar worden vergeleken.

1) In verschillende tests is het zeker het snelst om niet te vergrendelen, dus probeer concurrentie met grondstoffen te vermijden die leidt tot vergrendelde werking.

2) Interlocked.CompareExchange toont consequent superieure prestaties in multithreading, op de tweede plaats.

3) De derde slot, de kritieke zone, toont ook goede prestaties, dus weerleg anderen als ze zeggen dat de vergrendelingsprestatie laag is.

4) De vierde plaats is de atomaire variabele (atomaire) operatie, maar momenteel ondersteunt deze alleen de zelftoename en aftrekking van variabelen, en de toepasbaarheid is niet sterk.

5) De prestaties van de vijfde lees/schrijf-slot (ReaderWriterLockSlim) zijn ook oké, en het ondersteunt het lezen van niets, en de praktische bruikbaarheid is nog steeds relatief goed.

6) De overige semafore, evenementen en mutex presteren slechtst, natuurlijk hebben ze hun eigen toepassingsgebied, maar ze presteren niet goed in het omgaan met concurrentie van hulpbronnen.

Origineel linkadres:De hyperlink-login is zichtbaar.





Vorig:ASP.NET Core (16) Afhankelijk van injectie van dynamische registratiediensten
Volgend:De zachte route OpenWrt wordt gestart via een USB-stick
 Huisbaas| Geplaatst op 13-4-2023 18:46:52 |
C#-programma's staan slechts één instantie toe om de juiste code uit te voeren
https://www.itsvse.com/thread-3391-1-1.html

Het verschil tussen ManualResetEvent en AutoResetEvent wordt geleerd door C#-threads
https://www.itsvse.com/thread-4810-1-1.html

[Echte gevechten]. NET/C# gebruikt SemaphoreSlim om gelijktijdige uitvoeringsmethoden te beperken
https://www.itsvse.com/thread-10259-1-1.html

C# Lezen/Schrijven Lock ReaderWriterLockSlim-gebruik
https://www.itsvse.com/thread-3545-1-1.html

.net/c# Gebruiker multithreaded concurrency lock(string){...} Gedetailleerde uitleg
https://www.itsvse.com/thread-7764-1-1.html
Geplaatst op 13-4-2023 19:21:44 |
Leer een beetje...
Geplaatst op 16-5-2023 20:03:52 |
Leer een beetje...
Geplaatst op 2023-5-19 11:41:25 |
Leer leren
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com