0Pricing
C++ Academy · 课时

std::atomic 与内存顺序

为正确性和速度选择合适的内存顺序,并使用 std::atomic

std::atomic 与内存顺序 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

超越互斥锁

锁会将访问串行化——它们简单且正确,但会限制吞吐量。std::atomic 提供了用于高吞吐量并发代码的无锁构建块。

std::atomic 基础

std::atomic<T> 封装一个值,并支持原子的读取—修改—写入操作。

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

便捷运算符

对于算术类型,常用运算符都是原子的。

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

原子操作为何棘手

CPU 可能会跨核心重新排列内存操作。内存顺序规定了允许进行哪些重排序。

内存顺序

五种常见顺序:

  • memory_order_relaxed — 保证原子性,但不保证顺序
  • memory_order_acquire — 与 release 配对;之后的操作不会被重排到之前
  • memory_order_release — 与 acquire 配对;之前的操作不会被重排到之后
  • memory_order_acq_rel — 同时具备以上两者
  • memory_order_seq_cst — 顺序一致(默认值)

顺序一致性:安全的默认选择

默认的 seq_cst 行为直观——所有原子操作看起来都按照单一的全局顺序执行。它比 relaxed 顺序更慢,但更容易推理。

获取—释放配对

在生产者中使用 release,在消费者中使用 acquire。获取操作之后,匹配的释放操作之前发生的所有写入都可见。

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

宽松顺序

宽松原子操作保证原子性(不会产生撕裂读取),但允许任意重排序。当顺序无关紧要时,可将其用于简单计数器。

比较并交换

大多数无锁算法的基础。只有当当前值等于 expected 时,compare_exchange_strong(expected, desired) 才会以原子方式更新它。

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

弱 CAS 与强 CAS

即使值相等,compare_exchange_weak 也可能发生虚假失败。在循环中使用它(在某些平台上成本更低);在循环外使用强版本。

无锁与无等待

两种进度保证:

  • 无锁 — 任意时刻至少有一个线程取得进展
  • 无等待 — 每个线程都能在有界时间内取得进展

何时使用原子操作

原子操作并不总是比互斥锁更快。当您可以让关键路径保持简单时使用它们,例如用于计数器、标志和简单状态。对于复杂的共享状态,互斥锁通常更安全、更清晰。

快速检查

哪种内存顺序提供最强的保证,但速度也最慢?

回顾

std::atomic 提供带有显式内存顺序的无锁原语。默认使用 memory_order_seq_cst;对于生产者—消费者模式,使用 acquire/release 配对;仅在计数器等无顺序要求的原子操作中使用 relaxed。

常见问题解答

「std::atomic 与内存顺序」课时是免费的吗?

是的 — 「std::atomic 与内存顺序」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「std::atomic 与内存顺序」这节课中我会学到什么?

为正确性和速度选择合适的内存顺序,并使用 std::atomic 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「std::atomic 与内存顺序」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. std::atomic 与内存顺序
  2. 比较并交换:CAS 模式
  3. 无锁队列实现
  4. 危险指针与 ABA 问题
← 返回 C++ Academy