Sobes.tech
Junior

Wat is het verschil tussen een mutex en een semaphore?

sobes.tech AI

Antwoord van AI

Een mutex is een binaire semaphore die of vrij (waarde 1) of bezet (waarde 0) is. Het wordt gebruikt om kritieke secties te beschermen en exclusieve toegang tot een resource te garanderen. Alleen de thread die de mutex heeft verworven, kan deze vrijgeven.

Een semaphore is een generalisatie van een mutex, die een teller vertegenwoordigt. Het kan niet-negatieve waarden aannemen en wordt gebruikt om de toegang tot een beperkt aantal resources te beheren. Een thread kan een semaphore verwerven als de teller groter is dan nul (en deze verlagen), en vrijgeven (door de teller te verhogen). Een semaphore kan door een andere thread worden vrijgegeven, niet noodzakelijk degene die het heeft verworven.

Belangrijkste verschillen:

  • Doel: Mutex voor het beschermen van kritieke secties, Semaphore voor het beheren van toegang tot resources.
  • Waarde: Mutex (0 of 1), Semaphore (elke niet-negatieve waarde).
  • Eigendom: Mutex heeft een eigenaar (de thread die het heeft verworven), Semaphore heeft geen duidelijk eigendom.
  • Wie kan het vrijgeven: Alleen de eigenaar kan het vrijgeven in de mutex, elke thread kan het vrijgeven in de semaphore.
#include <mutex> // Voor std::mutex
#include <semaphore> // Voor std::counting_semaphore

std::mutex mtx; // Mutex voor het beschermen van de resource

void critical_section() {
    mtx.lock(); // Mutex verwerven
    // Toegang tot de gedeelde resource
    mtx.unlock(); // Mutex vrijgeven
}

// Semaphore voor het beheren van toegang tot 5 resources
std::counting_semaphore<5> sem(5);

void access_resource() {
    sem.acquire(); // Resource verwerven (verlaagt de teller)
    // Gebruik van de resource
    sem.release(); // Resource vrijgeven (verhoogt de teller)
}

Vergelijking in tabel:

Kenmerk Mutex Semaphore
Type Synchronisatieobject (binaire semaphore) Synchronisatieobject (teller)
Waarde 0 (bezet), 1 (vrij) Niet-negatief getal
Doel Bescherming van kritieke secties, wederzijdse uitsluiting Beheer van toegang tot beperkte resources
Eigendom Heeft een eigenaar (de thread die het heeft verworven) Heeft geen duidelijk eigendom
Wie kan het vrijgeven Alleen de eigenaar Elke thread