c++11 atomic

c++11 atomic中的6种 momey order
memory_order_relaxed: 只提供对单个atomic变量的原子读/写,不和前后语句有任何memory order的约束关系. 一般只用来做普通计数器,引用计数都不能做。可能导致别打cpu看不到最新的数据变化而产生错误的虚构行为。

memory_order_release memory_order_consume:thread A 对变量x release。thread B 对变量x consume。那么thread A对依赖x所有的写操作,对thread B依赖x的读操作都收可见的。

memory_order_release memory_order_acquire: thread A 执行release, thread B执行acquire。那么thread A 在release之前的所有写操作,对thread B acquire后任何读操作,都是可见的。
即 release执行的操作 不能reorder到release之后。acquire 之后的操作,不能reorder到acquire之前。

memory_order_acq_rel:是memory_order_acquire和memory_order_release的合并,这条语句前后的语句都不能被reorder

memory_order_seq_cst :比memory_order_acq_rel更加严格的顺序保证,memory_order_seq_cst执行完毕后,所有其cpu都是确保可以看到之前修改的最新数据的。如果前面的几个memory order模式允许有缓冲存在的话,memory_order_seq_cst指令执行后则保证真正写入内存。一个普通的读就可以看到由memory_order_seq_cst修改的数据,而memory_order_acquire则需要由memory_order_release配合才能看到,否则什么时候一个普通的load能看到memory_order_release修改的数据是不保证的。

x86的memory order是一种strong memory order,它保证:

LoadLoad是顺序的
一个cpu上前后两条load指令是顺序执行的,前面一条没执行完毕,后面一条不能执行
StoreStore是顺序的
一个cpu上前后两条store指令是顺序执行的,前面一条没执行完毕,后面一条不能执行
LoadStore
一个cpu上前面一条是Load指令,这条指令没执行完毕,后面一条store不能执行
x86不保证StoreLoad的顺序,一条Store指令在前,后面一条不相关的load指令可以先执行。因为这个顺序的不保证,导致Peterson lock实际上需要使用mfence指令才能在x86上实现

推荐阅读更多精彩内容

  • C++ 11 atomic 简介 Atomic类型是c++11里面引入的一种类型,它规定了当程序的多个线程同时访问...
    EFlql阅读 5,581评论 1 0
  • 原子类型和原子操作 并行编程、多线程与C++11 常见的并行编程有多种模型:共享内存、多线程、消息传递等。 多线程...
    ColdWave阅读 677评论 0 1
  • 我们在前面讲atomic时,每一个原子操作都有一个std::memory_order参数。这个参数就是C++11的...
    许了阅读 6,152评论 1 9
  • 程序世界的barrier 同步屏障(Barrier)是并行计算中的一种同步方法。对于一群进程或线程,程序中的一个同...
    AKTeamYang阅读 1,526评论 0 1
  • 参考cppreference参考The C++ Memory Model and Modern Hardware ...
    王侦阅读 1,896评论 0 2