Sobes.tech
Back to questions
Junior — Middle
80

Как отличить механизм синхронизации Semaphore от Mutual Exclusion (Mutex)?

Companies where asked
Itexus
СБЕРСБЕР
МТСМТС
СБЕР СболСБЕР Сбол
AvitoAvito

Answer from AI

sobes.tech AI

Semaphore и Mutex — это механизмы синхронизации, но у них разные цели и поведение:

  • Mutex (взаимное исключение) предназначен для защиты доступа к ресурсу, который может использоваться только одним потоком одновременно. Mutex гарантирует, что в каждый момент времени ресурс занят только одним владельцем. Обычно mutex имеет два состояния: заблокирован и разблокирован.

  • Semaphore (семафор) — более общий механизм, который управляет счетчиком, позволяющим ограничить количество потоков, одновременно получающих доступ к ресурсу. Например, семафор с счетчиком 3 позволит одновременно работать с ресурсом трем потокам.

Основное отличие:

  • Mutex — бинарный (0 или 1), используется для взаимного исключения.
  • Semaphore — счетчик, может быть больше 1, используется для ограничения количества одновременных доступов.

Пример в iOS (Swift) с использованием DispatchSemaphore:

let semaphore = DispatchSemaphore(value: 2) // максимум 2 потока одновременно

func accessResource() {
    semaphore.wait() // уменьшаем счетчик, если 0 — поток блокируется
    // Работа с ресурсом
    print("Поток получил доступ")
    semaphore.signal() // увеличиваем счетчик, освобождаем место
}

Mutex в iOS обычно реализуется через NSLock или pthread_mutex_t и гарантирует, что только один поток выполняет критическую секцию.