Junior
Mis vahe on mutexil ja semaforil?
sobes.tech AI
Vastus AI-lt
Mutex on binaarne semafor, mis on kas või vaba (väärtus 1) või hõivatud (väärtus 0). Seda kasutatakse kriitiliste sektsioonide kaitsmiseks ja tagab eksklusiivse juurdepääsu ressursile. Ainult niit, kes on mutexi haaranud, saab seda vabastada.
Semafor on mutexi üldistamine, mis kujutab endast loendurit. See võib võtta mitte-negatiivseid väärtusi ja seda kasutatakse piiratud ressurssidele juurdepääsu haldamiseks. Niit võib haarata semafori, kui loendur on suurem kui null (väheneb seda), ja vabastada semafori (suurendab loendurit). Semafori võib vabastada teine niit, mitte see, kes selle haaras.
Peamised erinevused:
- Eesmärk: Mutex kriitiliste sektsioonide kaitseks, Semafor ressurssidele juurdepääsu haldamiseks.
- Väärtus: Mutex (0 või 1), Semafor (mis tahes mitte-negatiivne arv).
- Omamine: Mutexil on omanik (niit, kes selle haaras), Semaforil ei ole selget omandiõigust.
- Kes võib vabastada: Mutexi võib vabastada ainult omanik, Semafori võib vabastada iga niit.
#include <mutex> // std::mutex
#include <semaphore> // std::counting_semaphore
std::mutex mtx; // Kriitiliste sektsioonide kaitse mutex
void critical_section() {
mtx.lock(); // Mutexi haaramine
// Ühise ressursi kasutamine
mtx.unlock(); // Mutexi vabastamine
}
// Semafor 5 ressursi haldamiseks
std::counting_semaphore<5> sem(5);
void access_resource() {
sem.acquire(); // Ressursi haaramine (loendur väheneb)
// Ressursi kasutamine
sem.release(); // Ressursi vabastamine (loendur suureneb)
}
Võrdlus tabelis:
| Omadus | Mutex | Semafor |
|---|---|---|
| Tüüp | Sünkroniseerimise objekt (binaarne semafor) | Sünkroniseerimise objekt (loendur) |
| Väärtus | 0 (võetud), 1 (vaba) | Mitte-negatiivne arv |
| Eesmärk | Kriitiliste sektsioonide kaitse, eksklusiivsus | Piiratud ressurssidele juurdepääsu haldamine |
| Omamine | Omab omanik (niit, kes selle haaras) | Ei oma selget omandiõigust |
| Kes võib vabastada | Ainult omanik võib vabastada | Iga niit võib vabastada |