Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 18751|Отговор: 0

[Бакшиши] C# Read/Write Lock ReaderWriterLockSlim usage

[Копирай линк]
Публикувано в 9.03.2017 г. 16:59:19 ч. | | | |
Концепцията за заключвания за четене-запис е проста, позволявайки на няколко нишки да получават заключвания за четене едновременно, но само една нишка може да заключва запис едновременно, затова се нарича и заключвания, които се използват и за споделено изключване. В C# се препоръчва да се използва класът ReaderWriterLockSlim за завършване на функцията за заключване на четене/запис.
В някои случаи броят на четенията към обект е много по-голям от броя на модификациите, и ако просто се заключи чрез заключване, това ще повлияе на ефективността на четене. Ако се използва заключване за четене-записване, няколко нишки могат да четат обекта едновременно и той ще бъде блокиран само когато обектът е зает от заключването за запис.
Просто казано, когато една нишка влезе в режим на четене, другите нишки все още могат да влязат в режим на четене, ако нишката иска да влезе в режим на запис в този момент, тогава тя трябва да бъде блокирана. Докато режимът за четене не излезе.
По същия начин, ако една нишка влезе в режим на запис, останалите нишки ще бъдат блокирани, независимо дали искат да пишат или четат.
Има 2 начина за влизане в режим на запис/четене:
EnterReadLock се опитва да влезе в режим на заключване в режим на запис.
TryEnterReadLock(Int32) се опитва да влезе в заключване в режим на четене с опция за избор на целочислен таймаут.
EnterWriteLock се опитва да влезе в състояние на заключване в режим на записване.
TryEnterWriteLock(Int32) се опитва да влезе в режим на заключване в режим на запис и времето за изтичане може да бъде избрано.
Има 2 начина за излизане от режим на запис/четене:
ExitReadLock намалява рекурсивния брой на режима на четене и излиза от режима на четене, когато резултатният брой е 0 (нула).
ExitWriteLock намалява рекурсивния брой на шаблона за запис и излиза от режима на запис, когато резултатният брой е 0 (нула).
Ето как да го използвате:



Виждате, че нишка 3 и нишка 4 могат да влязат в режим на четене едновременно, докато нишка 5 може да влезе в режим на запис след 5 секунди (тоест след като нишки 3 и 4 излязат от заключването на четене).
Модифицирайте горния код, първо отворете 2 нишки в режим на запис, а след това отворете нишки в режим на четене, кодът е следният:
      


Резултатите са следните:

Както виждате, нишка 3 и нишка 4 влизат в режим на запис, но нишка 3 заема заключването първо, така че нишка 4 трябва да изчака 10 секунди преди да влезе. Нишки 5 и 6 трябва да заемат заключването за четене, така че изчакайте нишка 4 да излезе от заключването на записа, преди да продължите.
TryEnterReadLock и TryEnterWriteLock могат да зададат таймаут, при преминаване към това изречение нишката ще блокира тук, ако заключването може да бъде заето в този момент, тогава връща true, ако времето за тайм-аут все още не е заел заключването, след това връща false, отказва се от заетостта на заключването и продължава да изпълнява следващия код директно.
EnterUpgradeableReadLock
Класът ReaderWriterLockSlim предоставя ъпгрейдваем режим на четене, който се различава от режима на четене по това, че може да бъде ъпгрейднат до режим на запис чрез извикване на методите EnterWriteLock или TryEnterWriteLock. Защото само една нишка може да бъде в режим на ъпгрейд едновременно. Нишка, която влиза в режим на надграждане, няма да влияе на нишката в режим на четене, тоест когато нишка влезе в режим на надграждане, всеки брой нишки могат да влязат в режим на четене едновременно без блокиране. Ако няколко нишки вече чакат да получат заключване на запис, изпълнението на EnterUpgradeableReadLock ще блокира, докато тези нишки изтекат или излязат от заключването на записа.
Следващият код показва как да се ъпгрейднете до заключване на запис в режим на надграждане за четене.



Влиянието на заключванията при четене/запис върху производителността е очевидно.
Следният тестов код:


Горният код симулира работата на 500 задачи, всяка от които заема нишка от пула на нишки, от които 20 са нишки за запис и 480 нишки за четене са симулирани. Отнема 10 ms за четене на данни и 100 ms за запис, за да се тества методът на заключването и метода ReaderWriterLockSlim съответно. Може да се направи приблизителна оценка за ReaderWriterLockSlim, при условие, че 480 нишки четат едновременно, тогава се консумират 10ms, 20 операции за запис заемат 2000ms, така че времето за използване е 2010ms, а за обикновения метод на заключване, тъй като всички са изключителни, така че 480 операции по четене заемат 4800ms + 20 операции за запис 2000ms = 6800ms. Резултатите показаха осезаемо подобрение в представянето.






Предишен:Офлайн инсталационен пакет за Visual Studio 2017 18GB Baidu cloud download
Следващ:Последните уязвимости и методи на атака във версиите 2.2 и 2.3 на Struts2
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com