Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 18751|Atbildi: 0

[Padomi] C# lasīšanas/rakstīšanas bloķēšana LasītājsWriterLockSlim lietošana

[Kopēt saiti]
Publicēts 09.03.2017 16:59:19 | | | |
Lasīšanas-rakstīšanas slēdzeņu jēdziens ir vienkāršs, ļaujot vairākiem pavedieniem iegūt lasīšanas slēdzenes vienlaicīgi, bet tikai vienam pavedienam ir atļauts iegūt rakstīšanas slēdzenes vienlaicīgi, tāpēc to sauc arī par koplietojamām ekskluzīvām slēdzenēm. C# ieteicams izmantot klasi ReaderWriterLockSlim, lai pabeigtu lasīšanas/rakstīšanas bloķēšanas funkciju.
Dažos gadījumos objekta lasījumu skaits ir daudz lielāks nekā modifikāciju skaits, un, ja tas ir vienkārši bloķēts ar bloķēšanu, tas ietekmēs lasīšanas efektivitāti. Ja tiek izmantota lasīšanas-rakstīšanas bloķēšana, vairāki pavedieni var nolasīt objektu vienlaicīgi, un tas tiks bloķēts tikai tad, kad objektu aizņem rakstīšanas bloķēšana.
Vienkārši sakot, kad pavediens nonāk lasīšanas režīmā, citi pavedieni joprojām var pāriet lasīšanas režīmā, pieņemot, ka pavediens šobrīd vēlas ieiet rakstīšanas režīmā, tad tas ir jābloķē. līdz lasīšanas režīma iziešanai.
Līdzīgi, ja pavediens pāriet rakstīšanas režīmā, pārējie pavedieni tiks bloķēti neatkarīgi no tā, vai viņi vēlas rakstīt vai lasīt.
Ir 2 veidi, kā ieiet rakstīšanas/lasīšanas režīmā:
EnterReadLock mēģina ieiet rakstīšanas režīma bloķēšanas stāvoklī.
TryEnterReadLock(Int32) mēģina ievadīt lasīšanas režīma bloķēšanas stāvokli ar iespēju atlasīt veselu skaitļu taimautu.
EnterWriteLock mēģina ieiet rakstīšanas režīma bloķēšanas stāvoklī.
TryEnterWriteLock(Int32) mēģina ieiet rakstīšanas režīma bloķēšanas stāvoklī, un var atlasīt taimauta laiku.
Ir 2 veidi, kā iziet no rakstīšanas/lasīšanas režīma:
ExitReadLock samazina lasīšanas režīma rekursīvo skaitu un iziet no lasīšanas režīma, ja iegūtais skaits ir 0 (nulle).
ExitWriteLock samazina rakstīšanas modeļa rekursīvo skaitu un iziet no rakstīšanas režīma, ja iegūtais skaits ir 0 (nulle).
Tālāk ir aprakstīts, kā to izmantot.



Jūs varat redzēt, ka 3. pavediens un 4. pavediens var ieiet lasīšanas režīmā vienlaicīgi, bet 5. pavediens var pāriet rakstīšanas režīmā pēc 5 sekundēm (tas ir, pēc tam, kad 3. un 4. pavediens iziet no lasīšanas bloķēšanas).
Modificējiet iepriekš minēto kodu, vispirms atveriet 2 pavedienus rakstīšanas režīmā un pēc tam atveriet pavedienus lasīšanas režīmā, kods ir šāds:
      


Rezultāti ir šādi:

Kā redzat, 3. pavediens un 4. pavediens pāriet rakstīšanas režīmā, bet 3. pavediens vispirms aizņem rakstīšanas bloķēšanu, tāpēc 4. pavedienam pirms ievadīšanas ir jāgaida 10 sekundes. 5. un 6. pavedienam ir jāaizņem lasīšanas bloķēšana, tāpēc pirms turpināšanas pagaidiet, līdz 4. pavediens iziet no rakstīšanas bloķēšanas.
TryEnterReadLock un TryEnterWriteLock var iestatīt taimautu, palaižot uz šo teikumu, pavediens šeit tiks bloķēts, ja slēdzeni var aizņemt šajā laikā, tad atgriezieties true, ja taimauta laiks vēl nav aizņēmis slēdzeni, pēc tam atgriezieties nepatiesi, atsakieties no slēdzenes okupācijas un turpiniet tieši izpildīt šādu kodu.
EnterUpgradeableReadLock
Klase ReaderWriterLockSlim nodrošina jaunināmu lasīšanas režīmu, kas atšķiras no lasīšanas režīma ar to, ka to var arī jaunināt uz rakstīšanas režīmu, izsaucot metodes EnterWriteLock vai TryEnterWriteLock. Jo tikai viens pavediens vienlaikus var būt jaunināmā režīmā. Pavediens, kas pāriet jaunināmā režīmā, neietekmēs pavedienu lasīšanas režīmā, tas ir, kad pavediens pāriet jaunināmā režīmā, jebkurš pavedienu skaits var pāriet lasīšanas režīmā vienlaicīgi bez bloķēšanas. Ja vairāki pavedieni jau gaida, lai iegūtu rakstīšanas bloķēšanu, palaižot EnterUpgradeableReadLock, tiks bloķēts, līdz šie pavedieni iestāsies taimauts vai izies no rakstīšanas bloķēšanas.
Šis kods parāda, kā jaunināt uz rakstīšanas bloķēšanu jaunināmā lasīšanas režīmā.



Lasīšanas/rakstīšanas bloķēšanas ietekme uz veiktspēju ir acīmredzama.
Šāds testa kods:


Iepriekš minētais kods simulē 500 uzdevumu darbību, no kuriem katrs aizņem pavedienu baseina pavedienu, no kuriem 20 ir rakstīšanas pavedieni un 480 lasīšanas pavedieni ir simulēti. Datu lasīšana aizņem 10 ms un 100 ms, lai rakstītu, lai pārbaudītu attiecīgi bloķēšanas metodi un ReaderWriterLockSlim metodi. ReaderWriterLockSlim var veikt aplēsi, pieņemot, ka vienlaicīgi tiek lasīti 480 pavedieni, tad tas patērē 10 ms, 20 rakstīšanas operācijas aizņem 2000 ms, tāpēc patērētais laiks ir 2010 ms, un parastajai bloķēšanas metodei, jo tās visas ir ekskluzīvas, tāpēc 480 lasīšanas operācijas aizņem 4800 ms + 20 rakstīšanas operācijas 2000 ms = 6800 ms. Rezultāti parādīja ievērojamu veiktspējas uzlabojumu.






Iepriekšējo:Visual Studio 2017 bezsaistes instalācijas pakotne 18 GB Baidu mākoņa lejupielāde
Nākamo:Jaunākās ievainojamības un uzbrukuma metodes Struts2 versijās 2.2 un 2.3
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com