Normālos apstākļos, kamēr ir iesaistīta vairāku pavedienu programmēšana, programmas sarežģītība ievērojami palielināsies, veiktspēja ievērojami samazināsies, un kļūdu varbūtība ievērojami palielināsies.
Daudzpavedienu programmēšana ir paredzēta, lai paralēli palaistu programmu, lai uzlabotu datu apstrādes iespējas, bet vairumā gadījumu tā ietver konkurenci par koplietojamiem resursiem, tāpēc, modificējot resursu objektus, tā ir jābloķē. Tomēr ir daudz veidu, kā ieviest slēdzenes, tāpēc apskatīsim vairāku veidu slēdzeņu ieviešanu un veiktspēju C#.
Vairāki veidi, kā izmantot slēdzenes
1. Atomu slēdzene
Panākt "bezbloķēšanas" konkurenci, izmantojot atomu operāciju Interlocked.CompareExchange.
Oficiālais skaidrojums ir nodrošināt atomu operācijas mainīgajiem, kas ir kopīgi ar vairākiem pavedieniem. Nosaukumvieta: System.Threading
2. Kritiskā zona
Vairāku pavedienu serializācija, lai piekļūtu publiskajiem resursiem vai koda daļai, ir ātra un piemērota datu piekļuves kontrolei. Slēdzenes sintakse C# ir kritiskā apgabala (monitora) sintakses cukurs.
3. Atomu darbība
Atomoperācijas, kas ir īpašs gadījums, pēc būtības ir drošas pavedieniem, tāpēc nav nepieciešams tās bloķēt.
Oficiāli interpretēts kā noteikta mainīgā vērtības palielināšana atomu operācijas veidā un rezultāta glabāšana. Nosaukumvieta: System.Threading
4. Lasīšanas un rakstīšanas bloķēšana
Lasīšanas-rakstīšanas slēdzenes ļauj lasīt resursus, kad raksta citas programmas, tāpēc, ja resurss atļauj netīru lasīšanu, tas ir piemērotāks.
Oficiālais skaidrojums norāda uz bloķētu stāvokli, ko izmanto, lai pārvaldītu piekļuvi resursiem, iespējojot vairāku pavedienu lasīšanu vai ekskluzīvu rakstīšanas piekļuvi. Nosaukumvieta ir System.Threading
5. Semafors
Semafori, kas paredzēti, lai kontrolētu ierobežotu lietotāju resursu skaitu.
Oficiālais skaidrojums ierobežo pavedienu skaitu, kas vienlaikus var piekļūt resursam vai resursu baseinam. Nosaukumvieta ir System.Threading
6. Pasākumi
Izmanto, lai paziņotu pavedienam, ka ir notikuši daži notikumi, sākot nākamā uzdevuma sākumu.
Oficiālajā skaidrojumā teikts, ka pavedienu sinhronizācijas notikumi tiek automātiski atiestatīti, kad signāls tiek saņemts pēc pavediena izlaišanas. Šādus veidus nevar mantot.
7. Savstarpēja izslēgšana
C# ir Mutex klase, tieši zem System.Threading nosaukumtelpas, Mutex faktiski ir mutex, kas var ne tikai risināt resursu konkurenci starp vairākiem pavedieniem, bet arī apstrādāt resursu konkurenci starp procesiem.
Veiktspējas pārbaudes kods
Koda palaišana
Veiktspējas testa rezultāti
Piezīme: Iepriekš minētie dati ir tikai pašreizējās testa vides aparatūras veiktspējas rezultāts, un tos var salīdzināt tikai savā starpā.
1) Dažādos testos tas noteikti ir ātrākais, lai nebloķētu, tāpēc mēģiniet izvairīties no resursu konkurences, kas noved pie bloķētas darbības.
2) Interlocked.CompareExchange konsekventi uzrāda izcilu veiktspēju multi-threading, ierindojoties otrajā vietā.
3) Trešā slēdzene, kritiskā zona, arī uzrāda labu veiktspēju, tāpēc, lūdzu, atspēkojiet citus, kad viņi saka, ka slēdzenes veiktspēja ir zema.
4) Ceturtā vieta ir atomu mainīgā (atomu) darbība, bet šobrīd tā atbalsta tikai mainīgo lielumu pašpalielināšanos un atņemšanu, un piemērojamība nav spēcīga.
5) Arī piektās lasīšanas / rakstīšanas slēdzenes (ReaderWriterLockSlim) veiktspēja ir laba, un tā neatbalsta neko nelasīšanu, un praktiskums joprojām ir salīdzinoši labs.
6) Pārējiem semaforiem, notikumiem un muteksiem ir vissliktākais sniegums, protams, tiem ir sava piemērošanas joma, bet tie nedarbojas labi, risinot resursu konkurenci.
Oriģinālās saites adrese:Hipersaites pieteikšanās ir redzama.
|