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

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

Короткий ответ

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

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 и гарантирует, что только один поток выполняет критическую секцию.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее