Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 4864|Răspunde: 4

[Sursă] 【Turn】C# concurență multi-threaded sub diverse blocaje

[Copiază linkul]
Postat la 2023-4-13 18:44:49 | | | |
În condiții normale, atâta timp cât este implicată programare multi-threaded, complexitatea programului va crește semnificativ, performanța va scădea semnificativ, iar probabilitatea apariției unor bug-uri va crește considerabil.

Programarea multithreaded este destinată să ruleze un program în paralel pentru a îmbunătăți capacitățile de procesare a datelor, dar în majoritatea cazurilor implică competiție pentru resurse comune, astfel că trebuie blocată la modificarea obiectelor de resursă. Totuși, există multe moduri de a implementa blocările, așa că să aruncăm o privire asupra implementării și performanței mai multor tipuri de blocaje în C#.

Mai multe moduri de a folosi lacătele

1. Blocaj atomic

Obținerea unei competiții "fără încuietori" prin operațiunea atomică Interlocked. CompareExchange.

Explicația oficială este de a furniza operații atomice pentru variabile partajate de mai multe fire de execuție. Spațiu de denumiri: System.Threading

2. Zonă critică

Serializarea mai multor fire pentru a accesa resurse publice sau o bucată de cod este rapidă și potrivită pentru controlul accesului la date. Sintaxa blocării în C# este un zahăr sintactic pentru zona critică (Monitor).

3. Funcționare atomică

Operațiunile atomice, care sunt un caz special, sunt inerent sigure pentru thread-uri, deci nu este nevoie să le blochezi.

Interpretată oficial ca incrementarea valorii unei variabile date sub forma unei operații atomice și stocarea rezultatului. Spațiu de denumiri: System.Threading

4. Blocare pentru citire și scriere

Blocările de citire-scriere permit citirea resurselor atunci când alte programe scriu, așa că dacă resursa permite citiri murdare, acest lucru este mai potrivit.

Explicația oficială indică o stare blocată folosită pentru gestionarea accesului la resurse, permițând citiri multi-threaded sau acces exclusiv la scriere. Spațiul de nume este System.Threading

5. Semafor

Semafore, concepute pentru a controla un număr limitat de resurse ale utilizatorului.

Explicația oficială limitează numărul de fire de discuție care pot accesa o resursă sau un pool de resurse în același timp. Spațiul de nume este System.Threading

6. Evenimente

Folosit pentru a notifica firul de discuție că au avut loc anumite evenimente, începând începutul unei sarcini succesoare.

Explicația oficială afirmă că evenimentele de sincronizare a firelor se resetează automat atunci când un semnal este primit după ce un fir este eliberat. Astfel de tipuri nu pot fi moștenite.

7. Excludere reciprocă

Există o clasă Mutex în C#, chiar sub spațiul de nume System.Threading, Mutex este de fapt un mutex, care nu doar că poate gestiona competiția resurselor între mai multe fire, ci și competiția între procese.


Cod de testare a performanței

Rulează codul

Rezultatele testelor de performanță



Notă: Datele de mai sus sunt doar rezultatul performanței hardware a mediului de testare curent și pot fi doar comparate între ele.

1) În diverse teste, este cu siguranță cel mai rapid să nu blochezi, așa că încearcă să eviți concurența resurselor care duce la blocarea operării.

2) Interblocat. CompareExchange arată constant performanțe superioare în multi-threading, clasându-se pe locul doi.

3) A treia încuietoare, zona critică, arată de asemenea performanțe bune, așa că vă rog să contraziceți pe alții când spun că performanța încuietorii este scăzută.

4) Locul patru este operația variabilă atomică (atomică), dar în prezent susține doar auto-creșterea și scăderea variabilelor, iar aplicabilitatea nu este puternică.

5) Performanța celei de-a cincea încuietoare de citire/scriere (ReaderWriterLockSlim) este de asemenea acceptabilă, și nu suportă nimic, iar practicitatea rămâne relativ bună.

6) Semaforele, evenimentele și mutexul rămași au cele mai slabe performanțe, desigur, au propriul lor domeniu de aplicare, dar nu se descurcă bine în gestionarea competiției resurselor.

Adresa originală a linkului:Autentificarea cu hyperlink este vizibilă.





Precedent:ASP.NET Nucleu (16) Dependent de injectarea serviciilor dinamice de înregistrare
Următor:Ruta soft OpenWrt este pornită prin un stick USB
 Proprietarul| Postat pe 2023-4-13 18:46:52 |
Programele C# permit doar o singură instanță să ruleze codul corect
https://www.itsvse.com/thread-3391-1-1.html

Diferența dintre ManualResetEvent și AutoResetEvent învățate prin firele C#
https://www.itsvse.com/thread-4810-1-1.html

[Luptă propriu-zisă]. NET/C# folosește SemaphoreSlim pentru a limita metodele de execuție concurentă
https://www.itsvse.com/thread-10259-1-1.html

C# Citire/Scriere Cititor Cititor Scriitor Blocat Utilizare redusă
https://www.itsvse.com/thread-3545-1-1.html

.net/c# Lock(string) de concurență multithreaded de utilizator {...} Explicație detaliată
https://www.itsvse.com/thread-7764-1-1.html
Postat la 2023-4-13 19:21:44 |
Învață puțin...
Postat la 2023-5-16 20:03:52 |
Învață puțin...
Postat la 2023-5-19 11:41:25 |
Învață să înveți
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com