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 |