Sobes.tech
Junior

Jaký je rozdíl mezi mutexem a semaforem?

sobes.tech AI

Odpověď od AI

Mutex je binární semafor, který je buď volný (hodnota 1), nebo obsazený (hodnota 0). Používá se k ochraně kritických sekcí a zajištění výlučného přístupu k prostředku. Pouze vlákno, které mutex získalo, ho může uvolnit.

Semafor je zobecněním mutexu, představujícím čítač. Může nabývat nezáporných hodnot a slouží k řízení přístupu k omezenému počtu zdrojů. Vlákno může získat semafor, pokud je čítač větší než nula (a sníží ho), a uvolnit ho (zvýší čítač). Semafor může být uvolněn jiným vláknem, nikoliv nutně tím, které ho získalo.

Hlavní rozdíly:

  • Účel: Mutex pro ochranu kritických sekcí, Semafor pro řízení přístupu ke zdrojům.
  • Hodnota: Mutex (0 nebo 1), Semafor (libovolné nezáporné číslo).
  • Vlastnictví: Mutex má vlastníka (vlákno, které ho získalo), Semafor nemá jasné vlastnictví.
  • Kdo může uvolnit: Pouze vlastník může uvolnit mutex, jakékoli vlákno může uvolnit semafor.
#include <mutex> // Pro std::mutex
#include <semaphore> // Pro std::counting_semaphore

std::mutex mtx; // Mutex na ochranu zdroje

void critical_section() {
    mtx.lock(); // Získání mutexu
    // Přístup ke sdílenému zdroji
    mtx.unlock(); // Uvolnění mutexu
}

// Semafor na řízení přístupu ke 4 zdrojům
std::counting_semaphore<4> sem(4);

void access_resource() {
    sem.acquire(); // Získání zdroje (snížení čítače)
    // Použití zdroje
    sem.release(); // Uvolnění zdroje (zvýšení čítače)
}

Porovnání v tabulce:

Vlastnost Mutex Semafor
Typ Synchronizační objekt (binární semafor) Synchronizační objekt (čítač)
Hodnota 0 (obsazen), 1 (volný) Číslo nenegativní
Účel Ochrana kritických sekcí, vzájemné vyloučení Řízení přístupu ke omezeným zdrojům
Vlastnictví Má vlastníka (vlákno, které ho získalo) Nemá jasné vlastnictví
Kdo může uvolnit Pouze vlastník Jakékoli vlákno