Sobes.tech
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