C++ Academy · Lektion

std::atomic og hukommelsesordener

Brug std::atomic med den rigtige hukommelsesorden for korrekthed og hastighed

Lektion 1 af 414 trin

std::atomic og hukommelsesordener er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.

Ud over mutexer

Låse serialiserer adgangen — de er enkle og korrekte, men begrænser gennemstrømningen. std::atomic leverer låsefri byggesten til samtidig kode med høj gennemstrømning.

Grundlæggende om std::atomic

En std::atomic<T> indkapsler en værdi og understøtter atomiske læse-ændre-skrive-operationer.

#include <atomic>
std::atomic<int> counter{0};
counter.fetch_add(1);    // atomic increment
int v = counter.load();
counter.store(0);

Praktiske operatorer

For aritmetiske typer er de almindelige operatorer atomiske.

std::atomic<int> n{0};
++n;          // atomic increment
n += 5;        // atomic add
int v = n;     // atomic load

Hvorfor atomiske operationer er vanskelige

CPU'en kan omarrangere hukommelsesoperationer på tværs af kerner. Hukommelsesrækkefølge angiver, hvilke omarrangeringer der er tilladt.

Hukommelsesrækkefølger

Fem almindelige rækkefølger:

  • memory_order_relaxed — atomisk, men uden rækkefølge
  • memory_order_acquire — kombineres med release; ingen omarrangering bagefter
  • memory_order_release — kombineres med acquire; ingen omarrangering før
  • memory_order_acq_rel — begge dele
  • memory_order_seq_cst — sekventielt konsistent (standard)

Sekventiel konsistens: sikkert standardvalg

Standardindstillingen seq_cst opfører sig intuitivt — alle atomiske operationer ser ud til at blive udført i én global rækkefølge. Den er langsommere end relaxed-rækkefølger, men nemmere at ræsonnere om.

Acquire-release-parring

Brug release i producenten og acquire i forbrugeren. Efter acquire er alle skrivninger, der fandt sted før den matchende release, synlige.

std::atomic<bool> ready{false};
int data = 0;

// producer
data = 42;
ready.store(true, std::memory_order_release);

// consumer
while (!ready.load(std::memory_order_acquire));
std::cout << data;    // sees 42

Relaxed-rækkefølge

Atomiske operationer med relaxed-rækkefølge sikrer atomicitet (ingen iturevne læsninger), men tillader enhver omarrangering. Brug dem til simple tællere, hvor rækkefølgen er ligegyldig.

Sammenlign-og-udskift

Grundlaget for de fleste låsefri algoritmer. compare_exchange_strong(expected, desired) opdaterer kun atomisk, hvis den aktuelle værdi er lig med expected.

std::atomic<int> a{10};
int expected = 10;
bool ok = a.compare_exchange_strong(expected, 20);
// if true, a is now 20; otherwise expected holds the actual current value

Svag kontra stærk CAS

compare_exchange_weak kan fejle fejlagtigt, selv når værdierne matcher. Brug den i løkker, hvor den kan være billigere på nogle platforme, og brug strong uden for løkker.

Låsefri kontra ventefri

To fremdriftsgarantier:

  • Låsefri — mindst én tråd gør fremskridt til enhver tid
  • Ventefri — hver tråd gør fremskridt inden for en begrænset tid

Hvornår skal du bruge atomiske operationer

Atomiske operationer er ikke altid hurtigere end mutexer. Brug dem, når du kan holde den kritiske sti enkel — tællere, flag og enkel tilstand. Til kompleks delt tilstand er mutexer som regel sikrere og tydeligere.

Hurtigt tjek

Hvilken hukommelsesrækkefølge har de stærkeste garantier, men er også den langsomste?

Opsummering

std::atomic leverer låsefri primitiver med eksplicit hukommelsesrækkefølge. Brug som standard memory_order_seq_cst; brug par af acquire/release til producent-forbruger-mønstre; brug kun relaxed til atomiske operationer uden rækkefølge, f.eks. tællere.

Gratis at komme i gang

Lær C++ med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “std::atomic og hukommelsesordener” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “std::atomic og hukommelsesordener”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “std::atomic og hukommelsesordener”?

Brug std::atomic med den rigtige hukommelsesorden for korrekthed og hastighed Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C++ Academy?

Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “std::atomic og hukommelsesordener”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C++ Academy-lektion?

Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. std::atomic og hukommelsesordener
  2. Compare-and-swap- og CAS-mønstre
  3. Implementering af en låsefri kø
  4. Hazard-pointere og ABA-problemet
← Tilbage til C++ Academy