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.
|