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