Under normale omstendigheter, så lenge multitrådet programmering er involvert, vil programmets kompleksitet øke betydelig, ytelsen vil synke betydelig, og sannsynligheten for feil vil øke betydelig.
Multitrådet programmering er ment å kjøre et program parallelt for å forbedre databehandlingsmulighetene, men i de fleste tilfeller innebærer det konkurranse om delte ressurser, så det må låses når ressursobjekter endres. Det finnes imidlertid mange måter å implementere låser på, så la oss se på implementeringen og ytelsen til flere typer låser i C#.
Flere måter å bruke låser på
1. Atomlås
Oppnå «låsløs» konkurranse gjennom atomoperasjonen Interlocked.CompareExchange.
Den offisielle forklaringen er å tilby atomære operasjoner for variabler som deles av flere tråder. Navnerom: System.Threading
2. Kritisk område
Serialisering av flere tråder for å få tilgang til offentlige ressurser eller et kodestykke er raskt og egnet for å kontrollere datatilgang. Låsesyntaksen i C# er et syntakssukker for det kritiske området (Monitor).
3. Atomoperasjon
Atomoperasjoner, som er et spesialtilfelle, er iboende trådsikre, så det er ikke nødvendig å låse dem.
Offisielt tolkes det som å øke verdien av en gitt variabel i form av en atomoperasjon og lagre resultatet. Navnerom: System.Threading
4. Les og skriv lås
Lese-skrive-låser gjør det mulig å lese ressurser når andre programmer skriver, så hvis ressursen tillater skitne lesninger, er dette mer passende.
Den offisielle forklaringen indikerer en låst tilstand som brukes til å administrere ressurstilgang, noe som muliggjør flertrådede lesinger eller eksklusiv skrivetilgang. Navnerommet er System.Threading
5. Semafor
Semaforer, designet for å kontrollere et begrenset antall brukerressurser.
Den offisielle forklaringen begrenser antall tråder som kan få tilgang til en ressurs eller ressurspool samtidig. Navnerommet er System.Threading
6. Arrangementer
Brukes til å varsle tråden om at noen hendelser har oppstått, og starte starten på en etterfølgeroppgave.
Den offisielle forklaringen sier at trådsynkroniseringshendelser automatisk tilbakestilles når et signal mottas etter at en tråd er sluppet. Slike typer kan ikke arves.
7. Gjensidig utelukkelse
Det finnes en Mutex-klasse i C#, rett under System.Threading-navnerommet, Mutex er faktisk en mutex, som ikke bare kan håndtere ressurskonkurranse mellom flere tråder, men også håndtere ressurskonkurranse mellom prosesser.
Ytelsestestkode
Kjør koden
Resultater fra ytelsestester
Merk: Ovenstående data er kun resultatet av maskinvareytelsen til det nåværende testmiljøet, og kan kun sammenlignes med hverandre.
1) I ulike tester er det definitivt raskest å ikke låse, så prøv å unngå ressurskonkurranse som fører til låst drift.
2) Interlocked.CompareExchange viser konsekvent overlegen ytelse i multitråding, og er nummer to.
3) Den tredje låsen, den kritiske sonen, viser også god ytelse, så vennligst motkreft andre når de sier at låsens ytelse er lav.
4) Den fjerde plassen er atomvariabel (atom) operasjon, men for øyeblikket støtter den kun selvøkning og subtraksjon av variabler, og anvendeligheten er ikke sterk.
5) Ytelsen til den femte lese-/skrivelåsen (ReaderWriterLockSlim) er også grei, og den støtter å ikke lese noe, og praktisk nytte er fortsatt relativt god.
6) De gjenværende semaforene, hendelsene og mutex har dårligst ytelse, selvfølgelig har de sitt eget bruksområde, men de presterer dårlig i forhold til ressurskonkurranse.
Opprinnelig lenkeadresse:Innloggingen med hyperkoblingen er synlig.
|