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