C++ 中的 std::memory_order 枚举

2025 年 5 月 12 日 | 阅读 4 分钟

在本文中,我们将讨论 C++ 中的 std::memory_order 枚举 及其示例。

  • std::memory_order 函数指定了内存访问(包括常规和 非原子内存 访问)相对于原子操作的放置顺序。
  • 在多核系统中,当多个线程同时无限制地读写多个变量时,一个线程可能会注意到值的变化顺序与另一个线程写入的顺序不同。
  • 不同的读取线程甚至可能以相同的顺序显示不同的修改。
  • 由于内存模型允许的编译器更改,某些相同的影响甚至可能在单 CPU 系统上显现。

原子函数

  • 保证在不受其他线程干扰的情况下执行的操作称为 原子操作
  • C++ 中对原子操作的支持由 <atomic> 头文件提供,其中包括 std::atomic 等类型和 std::atomic_load 和 std::atomic_store 等函数。
  • 库中的所有原子操作都具有默认行为,允许顺序一致性排序(见下文讨论)。
  • 可以为库的原子操作提供额外的 std::memory_order 参数,以指示编译器和处理器必须为该操作应用的精确约束(除了原子性)。

std 中的内存顺序枚举

std::memory 的顺序,原子操作的内存排序要求使用枚举指定。它提供了多种设置,每种设置表示不同的排序和同步保证级别。主要选择有:

memory_order_relaxed: 这是限制最少的排序要求。只要程序的行为符合顺序一致性模型,它就允许编译器和处理器重新排列内存操作。只要结果与操作以程序原始顺序执行的结果相同,就可以重新排序操作。

memory_order_consume: 与 memory_order_acquire 相比,这种同步类型效率较低。它旨在用于需要消费的活动,例如从内存中读取一个值,该值依赖于从内存中读取的另一个值。它确保依赖操作不会在消费操作之前发生。

memory_order_acquire: 它确保没有先前的依赖于从内存中读取的值的活动会相对于原子操作执行的读-修改-写 (RMW) 操作进行重新排序。它确保我们将获取由另一个线程写入的最新值。

memory_order_release: 它确保在原子操作执行的写入操作之后,不会执行任何依赖于记录值的附加操作。它确保其他线程将能够看到写入的值。

memory_order_acq_rel: 结合 memory_order_release 和 memory_order_acquire 产生 memory_order_acq_rel:它确保检索由另一个线程写入的最新值,并且写入的值对其他线程可见。

memory_order_seq_cst: 这种方式提供了最佳的排序保证。它保证了每个原子操作相对于所有其他操作的顺序一致性。它表明操作的执行顺序与它们在程序中出现的顺序相同。

伪代码

示例

让我们举一个例子来说明 C++ 中的 std::memory_order 枚举。

输出

std::memory_order enum in C++

结论

总而言之,您可以使用 C++ std::memory_order 枚举来声明原子操作的内存排序要求。理解这种内存排序对于编写准确有效的并发应用程序至关重要。程序独特的内存要求和所需的同步程度决定了应该使用哪种内存顺序。