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 |