Многопоточность и асинхронность - Примитивы синхронизации

Page / - Изменено Alexandr Fokin в 2023/01/11 15:17

Примитивы синхронизации

Изменено Alexandr Fokin

в 2023/01/11 15:17

Оглавление

Типы примитивов

Некоторые примитивы синхронизации

Материалы

Шаблон

Типы примитивов

Конструкции пользовательского режима
Конструкции режима ядра
Гибридные конструкции синхронизации потоков

Некоторые примитивы синхронизации

volatile https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/volatile https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.volatile?view=net-5.0	Модификатор переменных, ограничивающий оптимизации компилятора c#. Класс, содержащий методы, которые помимо операции чтения/записи накладывают ограничение (барьер), не позволяющее процессору менять порядок выполнения команд.
Interlocked https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.interlocked?view=net-5.0	Предоставляет набор некоторых операций, гарантирующих атомарность выполнения.
Monitor	Реализуют идею критической секции. Ограничивает степень параллелизма на секциях, находящихся после Monitor.Enter, одним потоком.
Lock	Оператор lock является оберткой над классом Monitor, его операциями Enter/Exit, обернутыми в try-finally.
Semaphore SemaphoreSlim	Семафоры позволяют ограничить доступ выполнения кода определенным количеством потоков.
Mutex	Используется для синхронизации на уровне операционной системы. Может использоваться несколькими приложениями в рамках одной ОС.
ReaderWriterLock ReaderWriterLockSlim	Позволяет ограничить параллелизм либо 1 писателем, либо многими читателями.
Spin*

Материалы

Блокировки

Общие сведения о примитивах синхронизации
https://learn.microsoft.com/ru-ru/dotnet/standard/threading/overview-of-synchronization-primitives?source=recommendations

.NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 1
https://habr.com/ru/post/452094

.NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 2
https://habr.com/ru/post/459514

Шаблон

При использовании инструментов важно освобождать освобождать блокировку, даже если в процессе выполнения логики возникнет исключение.
Во многих случаях имеет смысл реализовывать объект обертку, реализующую блокировку, и не допускающую неправильное использование.
Общий шаблон использования:

EnterLock();
try
{
//... Action
}
// catch {}
finally
{
ReleaseLock();
}