Назад к вопросам
Junior
109
questionbank

В чем разница между мьютексом и семафором?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Мьютекс — это бинарный семафор, который либо свободен (значение 1), либо занят (значение 0). Он используется для защиты критических секций и обеспечивает взаимоисключающий доступ к ресурсу. Только поток, который захватил мьютекс, может его освободить.

Семафор — это обобщение мьютекса, представляющее собой счетчик. Он может принимать неотрицательные значения и используется для управления доступом к ограниченному количеству ресурсов. Поток может захватить семафор, если счетчик больше нуля (уменьшая его), и освободить семафор (увеличивая счетчик). Семафор может быть освобожден другим потоком, не тем, который его захватывал.

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

  • Назначение: Мьютекс для защиты критических секций, Семафор для управления доступом к ресурсам.
  • Значение: Мьютекс (0 или 1), Семафор (любое неотрицательное число).
  • Владение: Мьютекс имеет владельца (поток, который его захватил), Семафор не имеет четкого понятия владения.
  • Кто может освободить: Мьютекс может освободить только владелец, Семафор может освободить любой поток.
#include <mutex> // Для std::mutex
#include <semaphore> // Для std::counting_semaphore

std::mutex mtx; // Мьютекс для защиты ресурса

void critical_section() {
    mtx.lock(); // Захват мьютекса
    // Доступ к общему ресурсу
    mtx.unlock(); // Освобождение мьютекса
}

// Семафор для управления доступом к 5 ресурсам
std::counting_semaphore<5> sem(5);

void access_resource() {
    sem.acquire(); // Захват ресурса (уменьшает счетчик)
    // Использование ресурса
    sem.release(); // Освобождение ресурса (увеличивает счетчик)
}

Сравнение в таблице:

Характеристика Мьютекс Семафор
Тип Объект синхронизации (бинарный семафор) Объект синхронизации (счетчик)
Значение 0 (занят), 1 (свободен) Неотрицательное число
Назначение Защита критических секций, взаимоисключение Управление доступом к ограниченным ресурсам
Владение Имеет владельца (поток, захвативший мьютекс) Не имеет четкого понятия владения
Кто может освободить Только владелец Любой поток