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

Изглед: 4864|Отговор: 4

[Източник] 【Turn】C# многонишкова паралелност под различни заключвания

[Копирай линк]
Публикувано на 2023-4-13 18:44:49 | | | |
При нормални обстоятелства, докато се използва многопоточно програмиране, сложността на програмата ще се увеличи значително, производителността ще намалее значително и вероятността от бъгове ще се увеличи значително.

Многонишковото програмиране е предназначено да изпълнява програма паралелно с цел подобряване на възможностите за обработка на данни, но в повечето случаи включва конкуренция за споделени ресурси, затова трябва да бъде заключено при модифициране на ресурсни обекти. Въпреки това, има много начини за реализиране на заключвания, затова нека разгледаме имплементацията и производителността на няколко типа заключвания в C#.

Няколко начина за използване на ключалки

1. Атомен заключващ механизъм

Постигане на "беззаключваща" конкуренция чрез атомната операция Interlocked.CompareExchange.

Официалното обяснение е да се предоставят атомарни операции за променливи, споделяни от множество нишки. Пространство от имена: System.Threading

2. Критична зона

Сериализацията на множество нишки за достъп до публични ресурси или код е бърза и подходяща за контрол на достъпа до данни. Синтаксисът на заключването в C# е синтактичен захар за критичната област (Monitor).

3. Атомна операция

Атомните операции, които са специален случай, са по своята същност безопасни по нишки, така че няма нужда да ги заключвате.

Официално се интерпретира като увеличаване на стойността на дадена променлива под формата на атомна операция и съхраняване на резултата. Пространство от имена: System.Threading

4. Чети и пиши за заключване

Заключванията за четене и запис позволяват ресурси за четене, когато други програми пишат, така че ако ресурсът позволява мръсни четива, това е по-подходящо.

Официалното обяснение показва заключено състояние, използвано за управление на достъпа до ресурси, позволяващо многонишкови четения или изключителен достъп до запис. Пространството от имена е System.Threading

5. Семафор

Семафори, проектирани да контролират ограничен брой потребителски ресурси.

Официалното обяснение ограничава броя на нишките, които могат да имат достъп до ресурсен или ресурсен пул едновременно. Пространството от имена е System.Threading

6. Събития

Използва се за уведомяване на нишката, че са възникнали някои събития, започвайки началото на следваща задача.

Официалното обяснение гласи, че събитията за синхронизация на нишки автоматично се нулират при получаване на сигнал след освобождаване на нишка. Такива видове не могат да бъдат наследени.

7. Взаимно изключване

Има клас Mutex в C#, точно под пространството на имената System.Threading, Mutex всъщност е mutex, който не само може да се справя с конкуренция за ресурси между множество нишки, но и конкуренция между процеси.


Код за тестове за производителност

Пусни кода

Резултати от тестове за производителност



Забележка: Горните данни са само резултат от хардуерната производителност на текущата тестова среда и могат да се сравняват само помежду си.

1) В различни тестове определено е най-бързо да не заключваш, затова се опитай да избягваш конкуренция за ресурси, която води до заключена работа.

2) Interlocked.CompareExchange постоянно показва превъзходна производителност при мултитрединг, заемайки второ място.

3) Третата заключваща зона, критичната зона, също показва добра производителност, така че моля, опровергайте другите, когато казват, че работата на заключването е ниска.

4) Четвърто място е операцията с атомна променлива (атомна), но в момента тя поддържа само самоувеличаване и изваждане на променливи, а приложимостта не е силна.

5) Производителността на петата заключване за четене/запис (ReaderWriterLockSlim) също е добра и поддържа нищо за четене, а практичността е относително добра.

6) Останалите семафори, събития и мютекс имат най-лоши резултати, разбира се, имат свой собствен обхват на приложение, но не се справят добре с конкуренцията за ресурси.

Оригинален адрес на връзката:Входът към хиперлинк е видим.





Предишен:ASP.NET Ядро (16) Зависи от инжектиране на динамични регистрационни услуги
Следващ:Софтуерният маршрут OpenWrt стартира чрез USB флашка
 Хазяин| Публикувано на 2023-4-13 18:46:52 |
C# програмите позволяват само една инстанция да изпълни правилния код
https://www.itsvse.com/thread-3391-1-1.html

Разликата между ManualResetEvent и AutoResetEvent, научена чрез C# теми
https://www.itsvse.com/thread-4810-1-1.html

[Истински бой]. NET/C# използва SemaphoreSlim за ограничаване на методите за едновременно изпълнение
https://www.itsvse.com/thread-10259-1-1.html

C# Read/Write Lock ReaderWriterLockSlim usage
https://www.itsvse.com/thread-3545-1-1.html

.net/c# Потребителски многонишков конкурентен lock(string){...} Подробно обяснение
https://www.itsvse.com/thread-7764-1-1.html
Публикувано на 2023-4-13 19:21:44 |
Научи малко...
Публикувано на 2023-5-16 20:03:52 |
Научи малко...
Публикувано на 2023-5-19 11:41:25 |
Научи се да учиш
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com