Назад к вопросам
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 (свободен) | Неотрицательное число |
| Назначение | Защита критических секций, взаимоисключение | Управление доступом к ограниченным ресурсам |
| Владение | Имеет владельца (поток, захвативший мьютекс) | Не имеет четкого понятия владения |
| Кто может освободить | Только владелец | Любой поток |