C++ Academy · Les

std::mutex, lock_guard en unique_lock

Bescherm gedeelde toestand met mutexen en RAII-hulpmiddelen voor locks

Les 2 van 414 stappen

std::mutex, lock_guard en unique_lock is een gratis C++ Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C++ Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C++ Academy bevat in totaal 4 lessen.

Waarom een mutex?

Meerdere threads die dezelfde gegevens benaderen, concurreren om toegang. Een mutex garandeert wederzijdse uitsluiting: er is altijd maar één thread die de vergrendeling vasthoudt.

De basis van std::mutex

Maak de mutex aan, vergrendel hem en ontgrendel hem. Handmatig vergrendelen is foutgevoelig — gebruik altijd RAII-hulpmiddelen.

#include <mutex>
std::mutex mtx;

mtx.lock();
// critical section
mtx.unlock();

std::lock_guard: RAII-vergrendeling

De eenvoudigste RAII-vergrendeling. Deze vergrendelt in de constructor en ontgrendelt in de destructor. Dit werkt perfect voor kritieke secties die geen uitzonderingen gooien.

std::mutex mtx;
int counter = 0;

void increment() {
    std::lock_guard<std::mutex> lock(mtx);
    ++counter;
}

std::scoped_lock (C++17)

Net als lock_guard, maar deze kan meerdere mutexen tegelijk vergrendelen zonder deadlock. Geef hier in moderne code de voorkeur aan.

#include <mutex>
std::scoped_lock lock(mtx1, mtx2, mtx3);  // locks all atomically

std::unique_lock: flexibele vergrendeling

Meer mogelijkheden dan lock_guard:

  • Kan midden in de scope worden ontgrendeld en opnieuw vergrendeld
  • Kan worden verplaatst (overdraagbaar eigendom)
  • Wordt gebruikt met voorwaardelijke variabelen
std::unique_lock<std::mutex> lock(mtx);
lock.unlock();        // release temporarily
// ... do something without the lock ...
lock.lock();           // reacquire

Deadlocks voorkomen

Twee threads kunnen in een deadlock terechtkomen als ze vergrendelingen in verschillende volgordes verkrijgen. Gebruik overal dezelfde volgorde, of gebruik std::scoped_lock met meerdere mutexen.

std::lock voor meerdere mutexen

Gebruik vóór C++17 std::lock om meerdere mutexen atomair te verkrijgen. std::scoped_lock is in C++17 overzichtelijker.

Recursieve mutex

Met std::recursive_mutex kan een thread een mutex meerdere keren vergrendelen. Dit wijst meestal op ontwerpproblemen — herstructureer de code liever.

try_lock en timed_mutex

try_lock geeft onmiddellijk terug als de vergrendeling in gebruik is. std::timed_mutex ondersteunt tijdgebonden pogingen om te vergrendelen.

Lezers-schrijversvergrendeling

Met std::shared_mutex (C++17) kunnen veel lezers tegelijk actief zijn of één schrijver exclusieve toegang krijgen. Gebruik dit voor werklasten met veel leesbewerkingen.

std::shared_mutex sm;
void read()  { std::shared_lock lk(sm);   /* read */ }
void write() { std::unique_lock lk(sm);   /* write */ }

Afweging van fijnmazigheid

Te grofmazig vergrendelen schaadt de gelijktijdigheid. Te fijnmazig vergrendelen brengt extra kosten met zich mee. Meet de prestaties en stem de vergrendeling af.

Alternatieven zonder vergrendeling

Overweeg voor scenario's met veel gelijktijdige toegang vergrendelingsvrije gegevensstructuren (atomics, vergrendelingsvrije wachtrijen). Ze zijn veel moeilijker correct te schrijven — gebruik ze alleen wanneer dat nodig is en na verificatie.

Korte controle

Welke RAII-vergrendeling heeft de voorkeur wanneer je meerdere mutexen tegelijk vergrendelt?

Samenvatting

Gebruik std::lock_guard voor eenvoudige kritieke secties, std::scoped_lock voor meerdere mutexen en std::unique_lock wanneer je flexibiliteit nodig hebt (voorwaardelijke variabelen, handmatig ontgrendelen). Gebruik altijd RAII — vergrendel en ontgrendel nooit handmatig.

Gratis beginnen

Leer C++ met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
51
Lessen
203

Veelgestelde vragen

Is de les “std::mutex, lock_guard en unique_lock” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad C++ Academy, waaronder “std::mutex, lock_guard en unique_lock”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus C++ Academy bevat in totaal 4 lessen.

Wat leer ik in “std::mutex, lock_guard en unique_lock”?

Bescherm gedeelde toestand met mutexen en RAII-hulpmiddelen voor locks Je oefent met C++ Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met C++ Academy te beginnen?

Ervaring vooraf is niet nodig. C++ Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “std::mutex, lock_guard en unique_lock”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over C++ Academy?

Ja. Elke les over C++ Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. std::thread: joinen en detacheren
  2. std::mutex, lock_guard en unique_lock
  3. Condition variables en workerpatronen
  4. Basisprincipes van std::async en std::future
← Terug naar C++ Academy