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: 18751|Răspunde: 0

[Bacșișuri] C# Citire/Scriere Cititor Cititor Scriitor Blocat Utilizare redusă

[Copiază linkul]
Postat pe 09.03.2017 16:59:19 | | | |
Conceptul de blocaje de citire-scriere este simplu, permițând mai multor fire să dobândească blocaje de citire simultan, dar doar un singur fir poate obține blocaje de scriere simultan, motiv pentru care se numește și blocaje shared-exclusive. În C#, se recomandă utilizarea clasei ReaderWriterLockSlim pentru a finaliza funcția de blocare a citirii/scrierii.
În unele cazuri, numărul de citiri către un obiect este mult mai mare decât numărul de modificări, iar dacă este pur și simplu blocat prin blocare, acest lucru va afecta eficiența citirii. Dacă se folosește un blocaj de citire-scriere, mai multe fire pot citi obiectul simultan, iar acesta va fi blocat doar când obiectul este ocupat de blocarea de scriere.
Pe scurt, când un fir de fir intră în modul de citire, celelalte fire pot intra în continuare în modul de citire, presupunând că un fir dorește să intre în modul de scriere în acel moment, atunci trebuie blocat. până când modul de citire iese.
În mod similar, dacă un fir de discuție intră în modul de scriere, celelalte fire vor fi blocate, indiferent dacă doresc să scrie sau să citească.
Există 2 moduri de a intra în modul scriere/citire:
EnterReadLock încearcă să intre în starea de blocare a modului de scriere.
TryEnterReadLock(Int32) încearcă să intre în starea de blocare a modului de citire, cu opțiunea de a selecta un timeout întreg.
EnterWriteLock încearcă să intre în starea Write Mode Lock.
TryEnterWriteLock(Int32) încearcă să intre în starea de blocare a modului de scriere, iar timpul de timeout poate fi selectat.
Există 2 moduri de a ieși din modul de scriere/citire:
ExitReadLock reduce numărul recursiv al modului de citire și iese din modul de citire când numărul rezultat este 0 (zero).
ExitWriteLock reduce numărul recursiv al modelului de scriere și iese din modul de scriere când numărul rezultat este 0 (zero).
Iată cum să o folosești:



Poți vedea că firele 3 și firul 4 pot intra în modul de citire în același timp, în timp ce firul 5 poate intra în modul de scriere după 5 secunde (adică după ce firele 3 și 4 ies din blocarea citirii).
Modificați codul de mai sus, deschideți mai întâi 2 fire în modul de scriere, apoi deschideți firele în modul citire, iar codul este următorul:
      


Rezultatele sunt următoarele:

După cum vezi, firul 3 și firul 4 intră ambele în modul de scriere, dar firul 3 ocupă mai întâi blocarea scrierii, așa că firul 4 trebuie să aștepte 10 secunde înainte de a intra. Thread-urile 5 și 6 trebuie să ocupe blocajul de citire, așa că așteaptă ca thread-ul 4 să iasă din blocajul de scriere înainte de a continua.
TryEnterReadLock și TryEnterWriteLock pot seta un timeout, când rulează această propoziție, thread-ul va bloca aici, dacă blocajul poate fi ocupat în acest moment, atunci returnează true, dacă timpul de timeout nu a ocupat încă blocarea, apoi returnează false, renunță la ocuparea blocajului și continuă executarea codului următor direct.
EnterUpgradeableReadLock
Clasa ReaderWriterLockSlim oferă un mod de citire care poate fi actualizat, care diferă de modul de citire prin faptul că poate fi de asemenea actualizat la modul de scriere prin apelarea metodelor EnterWriteLock sau TryEnterWriteLock. Pentru că doar un fir de discuție poate fi în modul upgradable la un moment dat. Un fir care intră în modul upgradabil nu va afecta firul în modul de citire, adică atunci când un fir intră în modul upgradabil, orice număr de fire pot intra în modul citire simultan fără blocare. Dacă mai multe fire așteaptă deja să obțină un blocaj de scriere, rularea EnterUpgradeableReadLock va bloca până când acele fire expiră sau ies din blocarea scrierii.
Codul următor arată cum să faci upgrade la blocarea scrierii în modul de citire upgradabilă.



Impactul blocărilor de citire/scriere asupra performanței este evident.
Următorul cod de test:


Codul de mai sus simulează funcționarea a 500 de sarcini, fiecare ocupând un fir de fir de fir, dintre care 20 sunt fire de scriere și 480 de fire de citire sunt simulate. Este nevoie de 10 ms pentru a citi datele și 100 ms pentru a scrie pentru a testa metoda blocării și, respectiv, metoda ReaderWriterLockSlim. Se poate face o estimare, pentru ReaderWriterLockSlim, presupunând că 480 de fire de fir sunt citite simultan, atunci consumă 10ms, 20 de operații de scriere ocupă 2000ms, deci timpul consumat este 2010ms, iar pentru metoda de blocare obișnuită, deoarece toate sunt exclusive, 480 de operații de citire ocupă 4800ms + 20 operații de scriere 2000ms = 6800ms. Rezultatele au arătat o îmbunătățire vizibilă a performanței.






Precedent:Pachet de instalare offline Visual Studio 2017 18GB descărcare Baidu cloud
Următor:Cele mai recente vulnerabilități și metode de atac în versiunile 2.2 și 2.3 ale Struts2
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