Sobes.tech
Back to questions
Junior — Middle
72

Объясните отличия между механизмами блокировки: 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)
    {
        // код, который должен выполняться одним потоком
    }
}