При нормални обстоятелства, докато се използва многопоточно програмиране, сложността на програмата ще се увеличи значително, производителността ще намалее значително и вероятността от бъгове ще се увеличи значително.
Многонишковото програмиране е предназначено да изпълнява програма паралелно с цел подобряване на възможностите за обработка на данни, но в повечето случаи включва конкуренция за споделени ресурси, затова трябва да бъде заключено при модифициране на ресурсни обекти. Въпреки това, има много начини за реализиране на заключвания, затова нека разгледаме имплементацията и производителността на няколко типа заключвания в 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) Останалите семафори, събития и мютекс имат най-лоши резултати, разбира се, имат свой собствен обхват на приложение, но не се справят добре с конкуренцията за ресурси.
Оригинален адрес на връзката:Входът към хиперлинк е видим.
|