C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++原子操作的内存序

C++原子操作的内存序使用及说明(memory ordering)

作者:当归. z Z

内存序主要用于控制多线程环境下的操作可见性和执行顺序,包括无序、消费序、获取、Release、Acq_Rels和_Seq_Cstt等等满足不同MW操作和严格顺序需求,根据不同场景选择合适的内存序,如可有助于优化性能和确保数据一致性

std::memory_order 用于指定原子操作的内存顺序约束,控制多线程环境下的操作可见性和执行顺序。

1.memory_order_relaxed(松散顺序)

特点

示例

std::atomic<int> counter{0};

void increment() {
    counter.fetch_add(1, std::memory_order_relaxed); // 无同步保证
}

适用场景

2.memory_order_consume(消费顺序)

特点

示例

std::atomic<int*> ptr{nullptr};
int data = 0;

void producer() {
    data = 42;
    ptr.store(&data, std::memory_order_release); // 发布指针
}

void consumer() {
    int* p;
    while (!(p = ptr.load(std::memory_order_consume))) { // 消费指针
        // 等待
    }
    assert(*p == 42); // 仅保证 p 依赖的操作有序
}

适用场景

3.memory_order_acquire(获取顺序)

特点

示例

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

void producer() {
    data = 42;
    ready.store(true, std::memory_order_release); // 发布数据
}

void consumer() {
    while (!ready.load(std::memory_order_acquire)) { // 等待 release
        // 自旋
    }
    assert(data == 42); // 保证看到 data = 42
}

适用场景

4.memory_order_release(释放顺序)

特点

示例

std::atomic<int> flag{0};
int data = 0;

void producer() {
    data = 42;
    flag.store(1, std::memory_order_release); // 确保 data = 42 在 flag = 1 之前
}

void consumer() {
    while (flag.load(std::memory_order_acquire) != 1) { // 等待 release
        // 自旋
    }
    assert(data == 42); // 保证看到 data = 42
}

适用场景

5.memory_order_acq_rel(获取-释放顺序)

特点

同时具备 acquire 和 release 语义

适用于 CAS(Compare-And-Swap)等操作

示例

std::atomic<int> counter{0};

void increment() {
    counter.fetch_add(1, std::memory_order_acq_rel); // 读-修改-写
}

适用场景

6.memory_order_seq_cst(顺序一致性)

特点

示例

std::atomic<bool> x{false}, y{false};
int z = 0;

void write_x() {
    x.store(true, std::memory_order_seq_cst); // 全局可见顺序
}

void write_y() {
    y.store(true, std::memory_order_seq_cst); // 全局可见顺序
}

void read() {
    while (!x.load(std::memory_order_seq_cst)) {}
    if (y.load(std::memory_order_seq_cst)) {
        z++; // 保证 x 和 y 的修改顺序一致
    }
}

适用场景

7.总结

内存序作用适用场景
relaxed仅保证原子性,无顺序约束计数器、无竞争统计
consume仅保证依赖该原子变量的操作有序指针发布(较少使用)
acquire保证后续操作不会重排到它之前(读同步)锁获取、数据同步
release保证之前操作不会重排到它之后(写同步)锁释放、数据发布
acq_rel同时具备 acquire 和 release(用于 RMW 操作)自旋锁、无锁数据结构
seq_cst全局顺序一致(最强约束,性能最低)需要严格顺序的算法

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文