C++:std::memory_order_relaxed(宽松内存序)

std::memory_order_relaxed 的含义

std::memory_order_relaxed 是 C++11 标准提供的几种内存序之一,表示该操作不需要与其他内存操作的顺序有任何关系。换句话说,使用 memory_order_relaxed 进行的读写操作只保证了这个操作本身的原子性,但不提供同步或顺序一致性的保证。
具体来说,使用 memory_order_relaxed 具有以下特点:

  1. 原子性: 即使使用 memory_order_relaxed,操作本身仍然是原子的,保证在并发情况下,多个线程不会看到部分更新的值。
  2. 无顺序保证: 与其他线程的操作顺序没有关系。编译器和处理器可以随意重排这些操作,但重排后的行为在每个线程内仍然是一致的。
  3. 性能优化: 由于没有顺序或同步的要求,memory_order_relaxed 可以在一些情况下减少同步开销,提高性能。尤其在不关心其他线程的执行顺序时,这种模式非常适用。

使用场景

memory_order_relaxed 通常用于以下场景:

  1. 无数据依赖的计数器: 如果你有一个全局计数器,多个线程只需要对它进行递增操作,而不关心其他线程的操作顺序,这时可以使用 memory_order_relaxed 来减少同步开销。
std::atomic<int> counter(0);

void increment() {
    counter.fetch_add(1, std::memory_order_relaxed);
}

  1. 非同步标志变量: 在某些情况下,你可能有一个标志变量,多个线程需要读取这个变量,但它们不依赖于其他线程的读写顺序。
std::atomic<bool> flag(false);

void set_flag() {
    flag.store(true, std::memory_order_relaxed);
}

bool check_flag() {
    return flag.load(std::memory_order_relaxed);
}

  1. 单例模式中的懒初始化: 在双重检查锁定模式中,如果我们只关心是否已经初始化过,而不关心线程之间的顺序性,可以使用 memory_order_relaxed 来提升性能。
std::atomic<Singleton*> _instance(nullptr);
std::mutex _mutex;

Singleton* Singleton::getInstance() {
    Singleton* tmp = _instance.load(std::memory_order_relaxed);
    if (tmp == nullptr) {
        std::lock_guard<std::mutex> lock(_mutex);
        tmp = _instance.load(std::memory_order_relaxed);
        if (tmp == nullptr) {
            tmp = new Singleton();
            _instance.store(tmp, std::memory_order_release);
        }
    }
    return tmp;
}

在这个例子中:

  • memory_order_relaxed 用于读取 _instance,因为我们在第一次检查时不关心其他线程的执行顺序。
  • 如果对象还没有初始化,进入锁定区域时再次使用 memory_order_relaxed 进行检查。
  • 一旦对象被创建,使用 memory_order_release 进行存储,确保其他线程在读取时能够看到最新的值。

总结

memory_order_relaxed 是一种在不关心线程间操作顺序的情况下使用的内存序。它只保证操作的原子性,而不保证操作的顺序一致性,因此可以提高性能,适用于那些对顺序不敏感的场景,如计数器、标志变量以及单例模式中的双重检查锁定等。在这些场景中,正确使用 memory_order_relaxed 可以避免不必要的同步开销,提升并发程序的执行效率。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不适合写代码的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值