C# - Многопоточность и асинхронность

Page / - Изменено Alexandr Fokin в 2022/07/29 03:49

Многопоточность и асинхронность

Изменено Alexandr Fokin

в 2022/07/29 03:49

Оглавление

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

Шаблон

Понятие критической секции.	Некоторый блок кода, в котором работа несколько поток ограничивается или управляется некоторым образом. Например в критической секции разрешена работа только одного потока, остальные потоки будут ожидать. (Т.е. пессимистичная блокировка)
Понятие токена.	(Поток проверяет токен, если токен свободен - забирает себе, иначе ожидает освобождения. В конце секции поток освобождает токен)

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

Monitor и конструкция Lock	Реализуют идею критической секции: то есть код, написанный между вызовами Monitor.Enter, Monitor.Exit на одном ресурсе может быть выполнен в один момент времени лишь одним потоком. Оператор lock оберткой над Enter/Exit обернутых в try-finally.
Semaphore	Семафоры позволяют ограничить доступ выполнения кода определенным количеством потоков.
Mutex	Используется для синхронизации на уровне операционной системы. Может использоваться несколькими приложениями в рамках одной ОС.
ReaderWriterLock ReaderWriterLockSlim	Либо много потоков читает, либо 1 поток пишет.
Конструкции пользовательского режима
Конструкции режима ядра
Гибридные конструкции синхронизации потоков

Материалы:

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

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

Шаблон

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

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

Простой пример:
Запись в один и тот же файл с разных потоков. (В определенный момент времени в файл записывает только 1 поток)

Книги

Асинхронное программирование в C# 5.0 | O’Reilly

Конкурентность в C#. Асинхронное, параллельное и многопоточное программирование. | O’Reilly

CLR via C# | Джеффри Рихтер