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

Версия 1.5 от Alexandr Fokin на 2022/10/04 17:59

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

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

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

  
  1. Модификатор переменных, ограничивающий оптимизации компилятора c#.
  2. Класс, содержащий методы, которые помимо операции чтения/записи накладывают ограничение (барьер), не позволяющее процессору менять порядок выполнения команд.
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* 

Материалы

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

Шаблон

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

EnterLock();
try
{  
 //... Action
}
// catch {}
finally
{
  ReleaseLock();
}
Теги:
Создал(а) Alexandr Fokin 2022/10/04 17:42