atomic

1. Store操作,可选如下顺序:

        memory_order_relaxed,

        memory_order_release,

        memory_order_seq_cst


2. Load操作,可选如下顺序:

        memory_order_relaxed,

        memory_order_consume,

        memory_order_acquire,

        memory_order_seq_cst。


3. Read-modify-write(读-改-写)操作,可选如下顺序:

        memory_order_relaxed,

        memory_order_consume,

        memory_order_acquire,

        memory_order_release,

        memory_order_acq_rel,

        memory_order_seq_cst。

顺序一致内存顺序/memory_order_seq_cst

定义规则:全部存取都按照顺序执行。

memory_order_seq_cst 表示该原子操作必须顺序一致的,这是C++11中所有atomic原子操作的默认值。这样来理解“顺序一致”:即代码在线程中运行的顺序与程序员看到的代码顺序一致。也就是说,用此值提示编译器“不要给我重排序指令,不要整什么指令乱序执行,就按照我代码的先后顺序执行机器指令”

松散内存顺序/memory_order_relaxed

定义规则:不对执行顺序做任何保证。

表示该原子操作指令可以任由编译器重排或者由处理器乱序执行。就是说”想怎么乱就怎么乱吧,不管了,只要能提高指令执行效率“。

Release-acquire内存顺序

load()使用memory_order_acquire,store()使用memory_order_release。

memory_order__acquire

规则定义:本线程中,所有后续的读操作,必须在本条原子操作完成后执行。(本线程中,我先读,你们后读……)

memory_order_release

规则定义:本线程中,所有之前的写操作完成后,才能执行本原子操作。(在本线程中,你们先写,我最后写……)

Release-consume内存顺序

memory_order_consume

规则定义:本线程中,所有后续的有关本数据的操作,必须在本条原子操作完成之后执行。(本线程中,我只关心我自己,当我用memory_order_consume时,后面所有对我的读写操作都不能被提前执行……)

相比于memory_order__acquire,memory_order_consume进一步放松了依赖关系。大家发现没有,前面讲的几种内存顺序都是在操控/安排多个atomic数据之间的读写顺序,而memory_order_consume仅仅考虑对一个atomic数据的读写顺序。

参考:std::memory_order - cppreference.com

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值