std::atomic::load
是 C++ 中的一个函数,用于读取 std::atomic
对象的值。这个函数会以原子方式读取存储的值,这意味着在多线程环境中,这个操作是线程安全的。
以下是一个简单的例子:
#include <atomic>
#include <iostream>
int main() {
std::atomic<int> atomicInt(10);
int value = atomicInt.load();
std::cout << "The value of atomicInt is: " << value << std::endl;
return 0;
}
在这个例子中,我们首先创建了一个 std::atomic<int>
对象 atomicInt
,并初始化为 10
。然后我们使用 load 函数
读取这个原子对象的值,并将其存储在 value
变量中。最后,我们打印出这个值。
std::atomic::load
函数可以接受一个参数,这个参数是一个 std::memory_order
枚举值,用于指定内存访问的顺序。如果没有提供这个参数,那么默认的内存访问顺序是 std::memory_order_seq_cst
,这意味着所有的读取和写入操作都会按照严格的顺序进行。
enum memory_order {
memory_order_relaxed,
memory_order_consume,
memory_order_acquire,
memory_order_release,
memory_order_acq_rel,
memory_order_seq_cst
};
这个枚举定义了C++中的六种内存顺序,它们用于指定多线程环境中的原子操作的内存访问顺序。以下是每种内存顺序的简单解释:
memory_order_relaxed
: 这是最弱的内存顺序。它只保证了单个原子操作的原子性,但不保证操作之间的顺序。也就是说,编译器和处理器可以自由地重新排序操作。memory_order_consume
: 这种内存顺序用于保证当前操作所依赖的操作的顺序。如果一个操作A读取了一个原子变量,并且一个操作B依赖于A,那么B不会在A之前执行。memory_order_acquire
: 这种内存顺序保证了当前操作之前的所有读或写操作都不会被重新排序到当前操作之后。memory_order_release
: 这种内存顺序保证了当前操作之后的所有读或写操作都不会被重新排序到当前操作之前。memory_order_acq_rel
: 这是memory_order_acquire和memory_order_release
的结合。它保证了当前操作之前的所有操作不会被重新排序到当前操作之后,同时也保证了当前操作之后的所有操作不会被重新排序到当前操作之前。memory_order_seq_cst
: 这是最强的内存顺序。它除了具有memory_order_acq_rel
的所有保证之外,还保证了所有线程看到的操作顺序是一致的。这些内存顺序提供了一种在保证多线程程序正确性的同时,允许编译器和处理器进行优化的方式。选择合适的内存顺序可以帮助你在保证程序正确性的同时,提高程序的性能。