Получи случайную криптовалюту за регистрацию!

Конспект по теме 'Примитивы синхронизации' из категории '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#