Sobes.tech
Junior

Aký je rozdiel medzi mutexom a semaforom?

sobes.tech AI

Odpoveď od AI

Mutex je binárny semafor, ktorý je buď voľný (hodnota 1), alebo obsadený (hodnota 0). Používa sa na ochranu kritických sekcií a zabezpečuje vzájomnú výlučnosť prístupu ku zdroju. Len vlákno, ktoré získalo mutex, ho môže uvoľniť.

Semafor je zovšeobecnenie mutexu, predstavuje čítač. Môže nadobúdať nezáporné hodnoty a slúži na riadenie prístupu k obmedzenému počtu zdrojov. Vlákno môže získať semafor, ak je čítač väčší ako nula (zníži ho), a uvoľniť semafor (zvýši čítač). Semafor môže byť uvoľnený iným vláknom, nie tým, ktoré ho získalo.

Hlavné rozdiely:

  • Účel: Mutex na ochranu kritických sekcií, Semafor na riadenie prístupu ku zdrojom.
  • Hodnota: Mutex (0 alebo 1), Semafor (ľubovoľné nezáporné číslo).
  • Vlastníctvo: Mutex má vlastníka (vlákno, ktoré ho získalo), Semafor nemá jasne definované vlastníctvo.
  • Kto môže uvoľniť: Mutex môže uvoľniť iba vlastník, Semafor môže uvoľniť ktorékoľvek vlákno.
#include <mutex> // Pre std::mutex
#include <semaphore> // Pre std::counting_semaphore

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

void critical_section() {
    mtx.lock(); // Získanie mutexu
    // Prístup ku spoločnému zdroju
    mtx.unlock(); // Uvoľnenie mutexu
}

// Semafor na riadenie prístupu ku 5 zdrojom
std::counting_semaphore<5> sem(5);

void access_resource() {
    sem.acquire(); // Získanie zdroja (zníženie čítača)
    // Použitie zdroja
    sem.release(); // Uvoľnenie zdroja (zvýšenie čítača)
}

Porovnanie v tabuľke:

Charakteristika Mutex Semafor
Typ Objekt synchronizácie (binárny semafor) Objekt synchronizácie (čítač)
Hodnota 0 (obsadené), 1 (voľné) Nezáporné číslo
Účel Ochrana kritických sekcií, vzájomná výlučnosť Riadenie prístupu k obmedzeným zdrojom
Vlastníctvo Má vlastníka (vlákno, ktoré ho získalo) Nemá jasne definované vlastníctvo
Kto môže uvoľniť Len vlastník Ktorékoľvek vlákno