std::mutex, lock_guard og unique_lock
Beskytt delt tilstand med mutex-er og RAII-hjelpere for låsing.
std::mutex, lock_guard og unique_lock er en gratis leksjon i C++ Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C++ Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C++ Academy inneholder totalt 4 leksjoner.
Hvorfor mutex?
Flere tråder som får tilgang til de samme dataene, konkurrerer om dem. En mutex garanterer gjensidig utelukkelse: bare én tråd har låsen om gangen.
Grunnleggende om std::mutex
Opprett, lås og lås opp. Manuell låsing er utsatt for feil — bruk alltid RAII-hjelpere.
#include <mutex>
std::mutex mtx;
mtx.lock();
// critical section
mtx.unlock();std::lock_guard: RAII-lås
Den enkleste RAII-låsen. Låser i konstruktøren og låser opp i destruktøren. Fungerer utmerket for kritiske seksjoner som ikke kaster unntak.
std::mutex mtx;
int counter = 0;
void increment() {
std::lock_guard<std::mutex> lock(mtx);
++counter;
}std::scoped_lock (C++17)
Som lock_guard, men kan låse flere mutexer samtidig uten deadlock. Foretrekk den i moderne kode.
#include <mutex>
std::scoped_lock lock(mtx1, mtx2, mtx3); // locks all atomicallystd::unique_lock: Fleksibel lås
Flere funksjoner enn lock_guard:
- Kan låses opp og låses på nytt midt i omfanget
- Kan flyttes, slik at eierskapet kan overføres
- Brukes sammen med betingelsesvariabler
std::unique_lock<std::mutex> lock(mtx);
lock.unlock(); // release temporarily
// ... do something without the lock ...
lock.lock(); // reacquireUnngå deadlock
To tråder kan havne i deadlock hvis de anskaffer låser i ulik rekkefølge. Anskaff låser i en konsekvent global rekkefølge, eller bruk std::scoped_lock med flere mutexer.
std::lock for flere mutexer
Før C++17 bruker du std::lock til å anskaffe flere mutexer atomisk. C++17-varianten std::scoped_lock er ryddigere.
Rekursiv mutex
std::recursive_mutex tillater at en tråd låser den flere ganger. Dette er vanligvis et tegn på designproblemer — refaktorer i stedet.
try_lock og timed_mutex
try_lock returnerer umiddelbart hvis låsen er opptatt. std::timed_mutex støtter tidsbegrensede forsøk på låsing.
Leser–skriver-lås
std::shared_mutex (C++17) tillater mange samtidige lesere eller én eksklusiv skriver. Bruk den for arbeidsbelastninger med mye lesing.
std::shared_mutex sm;
void read() { std::shared_lock lk(sm); /* read */ }
void write() { std::unique_lock lk(sm); /* write */ }Avveining av granularitet
For grovkornet låsing svekker samtidigheten. For finkornet låsing gir mer kostnader. Mål ytelsen og juster.
Låsefrie alternativer
For situasjoner med høy konkurranse om ressurser bør du vurdere låsefrie datastrukturer, for eksempel atomics og låsefrie køer. De er mye vanskeligere å skrive korrekt — bruk dem bare når det er nødvendig og verifisert.
Hurtigsjekk
Hvilken RAII-lås bør du foretrekke når du låser flere mutexer samtidig?
Oppsummering
Bruk std::lock_guard for enkle kritiske seksjoner, std::scoped_lock for flere mutexer og std::unique_lock når du trenger fleksibilitet, for eksempel med betingelsesvariabler eller manuell opplåsing. Bruk alltid RAII — kall aldri lock/unlock manuelt.
Lær deg C++ med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 51
- Leksjoner
- 203
Ofte stilte spørsmål
Er leksjonen «std::mutex, lock_guard og unique_lock» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien C++ Academy, inkludert «std::mutex, lock_guard og unique_lock», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i C++ Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «std::mutex, lock_guard og unique_lock»?
Beskytt delt tilstand med mutex-er og RAII-hjelpere for låsing. Du øver på C++ Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med C++ Academy?
Ingen tidligere erfaring er nødvendig. C++ Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «std::mutex, lock_guard og unique_lock»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne C++ Academy-leksjonen?
Ja. Alle C++ Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- std::thread – sammenføying og frakobling
- std::mutex, lock_guard og unique_lock
- Betingelsesvariabler og arbeidermønstre
- Grunnleggende om std::async og std::future