Sobes.tech
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