Объясните отличия между механизмами блокировки: lock, Semaphore и Mutex.
Answer from AI
sobes.tech AI
В C# существуют разные механизмы синхронизации для управления доступом к общим ресурсам в многопоточной среде:
-
lock — это синтаксический сахар для использования
Monitor.EnterиMonitor.Exit. Он обеспечивает эксклюзивный доступ к блоку кода одному потоку. Если другой поток пытается войти в этот блок, он будет ждать, пока блокировка не освободится. -
Mutex — это объект синхронизации, который может использоваться для межпроцессного взаимодействия. Mutex может быть глобальным и использоваться для синхронизации между разными процессами, в то время как
lockработает только внутри одного процесса. Mutex дороже по производительности, чем lock. -
Semaphore — это счётчик, который ограничивает количество потоков, одновременно получающих доступ к ресурсу. Например,
Semaphore(3)позволит одновременно работать с ресурсом максимум трем потокам. Semaphore полезен, когда ресурс может обслуживать несколько потоков, но с ограничением.
Итог:
lock— простой и быстрый механизм для эксклюзивного доступа внутри процесса.Mutex— для эксклюзивного доступа, включая межпроцессный.Semaphore— для ограничения количества одновременно работающих потоков с ресурсом.
Пример использования lock:
private readonly object _lockObj = new object();
void CriticalSection()
{
lock(_lockObj)
{
// код, который должен выполняться одним потоком
}
}