Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 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. Взаимное исключение

В C# есть класс Mutex, непосредственно под пространством имён System.Threading, 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# Чтение/запись Замок ReaderWriterLockSlim usage
https://www.itsvse.com/thread-3545-1-1.html

.net/c# Пользовательский многопоточный concurrency 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