前置知识: C++

内存序与无锁编程

00:00
1 min Advanced 2026/6/14

C++内存序与无锁编程详解:std::memory_order。

1. 内存序

enum memory_order {
    memory_order_relaxed,  // 无顺序保证
    memory_order_consume,  // 数据依赖顺序
    memory_order_acquire,  // 获取语义
    memory_order_release,  // 释放语义
    memory_order_acq_rel,  // 获取+释放
    memory_order_seq_cst   // 顺序一致(默认)
};

2. 各内存序含义

2.1 relaxed

std::atomic<int> counter{0};
counter.fetch_add(1, std::memory_order_relaxed);
// 只保证原子性,不保证顺序

2.2 acquire/release

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

// 线程 A
data = 42;
ready.store(true, std::memory_order_release);

// 线程 B
while (!ready.load(std::memory_order_acquire)) {}
// 保证看到 data = 42

3. 无锁编程示例

template<typename T>
class LockFreeStack {
    struct Node {
        T data;
        Node* next;
    };
    std::atomic<Node*> head_{nullptr};

public:
    void push(T value) {
        Node* new_node = new Node{std::move(value), head_.load(std::memory_order_relaxed)};
        while (!head_.compare_exchange_weak(new_node->next, new_node,
            std::memory_order_release, std::memory_order_relaxed)) {}
    }
};

4. ABA 问题

CAS 操作可能遇到 ABA 问题从 A 变为 B 再变回 A,CAS 认为没有变化解决方案:带版本号的指针std::atomic<std::shared_ptr>

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式