Junior
Jaka jest różnica między mutexem a semaforem?
sobes.tech AI
Odpowiedź od AI
Mutex to binarny semafor, który jest albo wolny (wartość 1), albo zajęty (wartość 0). Używa się go do ochrony sekcji krytycznych i zapewnienia wyłącznego dostępu do zasobu. Tylko wątek, który go przejął, może go zwolnić.
Semafor to uogólnienie mutexa, reprezentujące licznik. Może przyjmować wartości nieujemne i służy do zarządzania dostępem do ograniczonej liczby zasobów. Wątek może przejąć semafor, jeśli licznik jest większy od zera (zmniejszając go), i zwolnić go (zwiększając licznik). Semafor może być zwolniony przez inny wątek, niekoniecznie tego, który go przejął.
Główne różnice:
- Cel: Mutex do ochrony sekcji krytycznych, Semafor do zarządzania dostępem do zasobów.
- Wartość: Mutex (0 lub 1), Semafor (dowolna liczba nieujemna).
- Własność: Mutex ma właściciela (wątek, który go przejął), Semafor nie ma wyraźnego pojęcia własności.
- Kto może zwolnić: Tylko właściciel może go zwolnić w przypadku mutexa, dowolny wątek w przypadku semafora.
#include <mutex> // Dla std::mutex
#include <semaphore> // Dla std::counting_semaphore
std::mutex mtx; // Mutex do ochrony zasobu
void critical_section() {
mtx.lock(); // Przejęcie mutexa
// Dostęp do wspólnego zasobu
mtx.unlock(); // Zwolnienie mutexa
}
// Semafor do zarządzania dostępem do 5 zasobów
std::counting_semaphore<5> sem(5);
void access_resource() {
sem.acquire(); // Przejęcie zasobu (zmniejsza licznik)
// Użycie zasobu
sem.release(); // Zwolnienie zasobu (zwiększa licznik)
}
Porównanie w tabeli:
| Cecha | Mutex | Semafor |
|---|---|---|
| Typ | Obiekt synchronizacji (semfer binarny) | Obiekt synchronizacji (licznik) |
| Wartość | 0 (zajęty), 1 (wolny) | Liczba nieujemna |
| Cel | Ochrona sekcji krytycznych, wyłączność mutua | Zarządzanie dostępem do ograniczonych zasobów |
| Własność | Ma właściciela (wątek, który go przejął) | Nie ma wyraźnego pojęcia własności |
| Kto może zwolnić | Tylko właściciel | Dowolny wątek |