Конспект по теме 'Примитивы синхронизации' из категории 'C#' Ч | .NET backend study
Конспект по теме "Примитивы синхронизации" из категории "C#"
Часть I - общая информация
Существует несколько способов для синхронизации доступа нескольких потоков к общему ресурсу.
⦁ Конструкция lock
Примерный вид конструкции:
static object locker = new object();
lock(locker)
{
//код, доступ к которому должен быть синхронизирован
}
Весь код, который находится внутри этой конструкции является недостижимым (т.е. блокируется) для других потоков, пока с ним не завершит работу текущий поток. Т.е. блокировка является эксклюзивной.
⦁ Мониторы
По сути, конструкция lock является синтаксическим сахаром над мониторами, инкапсулируя в себе синтаксис использования мониторов. Блокировка также является эксклюзивной.
Примерный вид конструкции:
try
{
Monitor.Enter();
//код, доступ к которому должен быть синхронизирован
}
finally
{
Monitor.Exit();
}
⦁ Мьютексы
Примерный вид конструкции:
static Mutex mutex = new Mutex();
mutex.WaitOne();
//код, доступ к которому должен быть синхронизирован
mutex.ReleaseMutex();
Позволяет осуществлять межпроцессорную синхронизацию. Блокировка на код также будет эксклюзивной.
⦁ Семафоры
Примерный вид конструкции:
static Semaphore semaphore = new Semaphore(3, 3);
semaphore.WaitOne();
//код, доступ к которому должен быть синхронизирован
semaphore.Release();
Конструктор класса Semaphore принимает 2 параметра: какому числу будет изначально доступен семафор и какое максимальное число объектов будет использовать этот семафор.
Во время выполнения semaphore.Release() в семафоре освобождается одно место - и один из ожидающих потоков займёт освободившееся место.
Т.е. ,как мы видим, блокировка не является эксклюзивной. Сразу несколько потоков будут иметь доступ к коду. И пока один из этих потоков не закончит работу и не освободит ресурс, новый поток не сможет завладеть этим ресурсом.
Вернуться в бэклог категории C#