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

Bekijken: 46741|Antwoord: 7

[Bron] Vluchtig versus Interlocked versus slot

[Link kopiëren]
Geplaatst op 27-08-2018 14:40:35 | | |
Stel dat er een klasse is die een publiek int-tellerveld bevat dat door meerdere threads toegankelijk is, en dit aantal zal alleen maar toenemen of dalen.

Bij het toevoegen van dit veld, welke van de volgende schema's moeten worden gebruikt, en waarom?

  • lock(this.locker) this.counter++;
  • Interlocked.Increment (ref this.counter);
  • Verander de toegangsmodificator van counter naar publieke volatiel


Het slechtste (geen van hen werkt echt)

Verander de toegangsmodificator van counter naar publieke volatiel

Deze aanpak is eigenlijk helemaal niet veilig, en het punt van volatile is dat meerdere threads die op meerdere CPU's draaien data bufferen en uitgevoerde instructies herschikken.

Als het niet-vluchtig is, moet CPU B even wachten om de verhoogde waarde te zien wanneer CPU A met een waarde toeneemt, wat tot problemen kan leiden.

Als het vluchtig is, zorgt het ervoor dat beide CPU's dezelfde waarde tegelijk zien. Maar het vermijdt niet cross-cutting lees- en schrijfbewerkingen.

Waarde toevoegen aan een variabele vereist eigenlijk drie stappen

1. Lezen, 2. Voeg toe 3. Schrijf

Stel dat thread A de waarde van teller als 1 leest en niet klaar is om te verhogen, dan leest thread B ook de waarde van teller als 1, en beginnen beide threads incrementele en schrijfbewerkingen uit te voeren. De waarde van de laatste teller is 2. Dit klopt niet, beide threads hebben een verhogingsoperatie uitgevoerd, en het juiste resultaat zou 3 moeten zijn. Dus het labelen als vluchtig is simpelweg onveilig.

Het is beter

lock(this.locker) this.counter++;

Op deze manier is het veilig (vergeet niet om overal waar je bij deze counter wilt komen te vergrendelen, natuurlijk). Het voorkomt dat andere threads de vergrendelde code uitvoeren. En het voorkomt ook het hierboven genoemde multi-CPU instructiesequencing-probleem. Het probleem is dat lock traag is in prestaties, en als je lock op andere, niet-gerelateerde plekken gebruikt, kan het je andere threads blokkeren.

Beste

Interlocked.Increment (ref this.counter);

Dit is veilig en zeer efficiënt. Het voert lees-, verhoog- en schrijfbewerkingen uit in één atoom zonder onderbroken te worden in het midden. Omdat het andere code niet beïnvloedt, hoef je elders geen sloten te onthouden. En het is ook erg snel (zoals MSDN zegt, is het op de CPU's van vandaag vaak gewoon een instructie).

Maar ik weet niet helemaal zeker of het ook het instructievolgordeprobleem van de CPU kan oplossen, of dat het in combinatie met vluchtig en deze increment gebruikt moet worden.

Supplement: Welke problemen lost vluchtig goed op?

Aangezien vluchtig multithreading niet kan voorkomen, wat kan het dan doen? Een goed voorbeeld is dat je twee threads hebt: de ene schrijft altijd naar een variabele, stel dat deze variabele queneLength is, en de andere leest altijd data uit deze variabele. Als queueLenght niet vluchtig is, kan thread A 5 keer lezen, maar thread B kan vertraagde data zien, of zelfs data in de verkeerde volgorde. Een oplossing is het gebruik van lock, maar in dit geval kun je ook vluchtig zijn. Dit zorgt ervoor dat thread B altijd de nieuwste data ziet die door thread A is geschreven, maar deze logica werkt alleen als je het niet leest tijdens het schrijven, en als je het niet schrijft wanneer je het leest. Zodra meerdere threads lees-wijzigen-schrijfbewerking willen uitvoeren, moet je Interlocked of lock gebruiken.





Vorig:Java MD5-encryptiemethode
Volgend:Linq implementeert niet in en in conditionele queries in SQL
Geplaatst op 29-08-2018 16:21:42 |
Hallo, de code die je eerder hebt gemaakt die highcharts, gestapelde histogrammen en drillbare histogrammen combineert? Ik zou graag willen vragen of je een code kunt sturen die bewerkt kan worden op de https://jshare.com.cn/demos/hhhhDz?hc-theme=grid-light-interface?
Geplaatst op 29-08-2018 16:22:13 |
Het hele netwerk is slechts je hulpbron.
Geplaatst op 29-08-2018 16:22:55 |
Omdat de vorige 90 jaar geleden geen boodschap konden achterlaten. dus
Geplaatst op 29-08-2018 16:40:40 |
Is het handig om contactgegevens toe te voegen? Overleg met jou
 Huisbaas| Geplaatst op 15-09-2018 13:10:16 |
private statische int safeInstanceCount = 0; Werk met atomen
System.Threading.Interlocked.Increment(ref safeInstanceCount); Zelfverhoging 1
System.Threading.Interlocked.Decrement (ref safeInstanceCount); Zelf-min 1
Geplaatst op 21-05-2020 16:43:54 |
Steun de eigenaar om te delen
 Huisbaas| Geplaatst op 11-06-2020 15:00:16 |
1. Concept

In een multithreaded omgeving worden bewerkingen die niet worden onderbroken door thread-planningsmechanismen; Zodra deze operatie begint, draait deze tot het einde, zonder enige contextwisseling (wisselen naar een andere thread) ertussen.

2. Klasse

System.Threading.Interlocked statische klasse

3. Veelgebruikte functies (zie de rest)

1. publieke statische int Decrement (referentie int locatie); Trek de waarde van de gespecificeerde variabele af in de vorm van een atomaire bewerking en sla het resultaat op

Equivalent aan lock(obj){i--; }

2. publieke statische int Increment (ref int locatie); Verhoog de waarde van de gespecificeerde variabele in de vorm van een atomaire bewerking en sla het resultaat op

Equivalent aan lock(obj){i++; }
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