memory_order——概念及定义说明

memory_order

类型效果作用范围
memory_order_acquire当前线程的所有读写无法通过重排放到这个加载(load)之前,其他线程对相同原子变量的写操作对当前线程也是可见的。load
memory_order_release当前线程的所有读写无法重排到这个存储(store)之后,所有当前线程的写操作对于其他acquire相同原子变量的线程都是可见的store
memory_order_acq_rel组织读写重排到原子变量load之前或store之后,对这个原子变量的读写对各个线程都是可见的read-modify-write
memory_order_seq_cst这个内存序在读、写、读-改-写的操作和上面的三种一样,但是附加一个总体序存在,这个总体序在让各个线程观察到相同的修改。load/store/read-modify-write

形式化描述

Sequenced-before

在相同的线程,求值A可能sequenced-before求值B,就像求值顺序中描述的一样。

Carries dependency

在相同线程中,如果下列条件成立,那么求值A sequenced-before求职B可能会同时carry a dependency into B,也就是B依赖于A:

  1. A的值作为B的操作,除以下情形:
    1. 如果B是一个对std::kill_dependency的调用
    2. 如果A是原生的&&, ||, ?: 或者 , 操作的左操作数;
  2. A写了一个数值对象M,B从数值对象M中读取;
  3. B依赖于X,而X依赖于A。

Modification order

对于指定atomic变量在全局序(total order)下的所有修改都是特指于该atomic变量的。
以下四点需求对于所有原子操作都是有保证的:

  1. Write-write coherence:如果求值A(A修改了一些原子的M,写操作)happens-before求值B(B也修改一些原子的变量M),那么在M的修改顺序上A的效果比B出现地早。

  2. Read-read coherence:

如果满足以下条件

写入
读取
读取
happen-before
写入
before
before
before
X
M
A
B
Y

则B中的值不是X传入的也是X之后side effect Y。

  1. Read-write coherence:

如果A对于M的读操作happens-before B对于M的写操作,那么A获得的值来自于B之前对于M的写操作side effect X。

  1. Write-read coherence:

如果一个对于原子对象M的side effect X(一个写操作)happen-before一个对于相同原子对象M的值计算操作B(一个读操作),那么B的求值将会从side effect X取得这个值或者从一个在修改M值的操作上位于X之后的side effect Y。

happen-before
follow
写入
写入
读取
X
B
Y
M

Release sequence

在一个release操作A被在原子对象M上演绎以后,满足以下条件的对M的modification order最长连续子序列被称为以A开头的release sequence.

  1. 演绎了A的线程演绎(peformed)的写. (until C++20)
  2. 其他线程的所有对M的read-modify-write操作。

Release operation

通过memory_order_release或者更强的原子变量存储操作被称为release操作。互斥量(Mutex)的unlock()操作也是一个release操作。需要注意的是,std::atomic_thread_fence会强制增加一个比release操作更强的同步需求.

Synchronizes with

如果在线程A中一个原子的store是一个release操作,在B线程中同一个原子变量的load是一个acquire操作,并且B中读到的值是A中写入的值,那么称为线程Asynchronizes-with线程B。

Dependency-order berfore

满足以下条件即可称为A的求值dependency-before B的求值

  1. A在原子的M上演绎(perform)了一个release操作,并且另外一个线程中,B在相同原子变量M上演绎了一个consume操作,并且B读取的值是A写的(或者被A开头的release sequence写的, until C++ 20)

  2. A dependency-order before X,并且X carries a dependency into B.

Inter-thread happens-before

在两个线程间,如果满足以下条件之一则称为A inter-thread happens before B:

  1. A synchronizes-with B;
  2. A dependency-order before B;
  3. A synchronizes-with 一个求值X,并且X是sequenced-before B的;
  4. A sequenced-before一个求值X,并且X inter-thread happens-before B;
  5. A inter-thread happens-before求值X,并且X inter-thread happens-before B;

Happens-before

不考虑多线程,当满足以下条件之一时,称为求值A happens-before求值B

  1. A sequenced-before B;
  2. A inter-thread happens before B;

应用要求,如果必要的话通过介绍额外的同步,保证happens-before是非循环的。
如果一个求值修改某内存位置,另外一个读或者写了同样内存地址的,并且其中至少有一个是非原子的,那么除非两个求值之间存在happens-before的操作,否则结果是未定义的。

Simply happens-before(since C++ 20)

不考虑多线程,当满足以下条件之一是被称为求值A simply happens-before 求值B:

  1. A sequenced-before B;
  2. A synchronizes-with B;
  3. A simply happens-before X, 并且X simply happens-before B;

注意:如果没有consume operation,那么simply happens-before和happens-before是一个意思;

Strongly happens-before

不考虑多线程,满足以下条件之一时,称为求值A strongly happens-before 求值B

until C++20(译者注:在20之前strongly和simply的规则看上去一模一样)
  1. A sequnced-before B.
  2. A synchronizes-with B;
  3. A strongly happens-before X, 并且X strongly happens-before B;
since C++20
  1. A sequenced-before B;
  2. A synchronizes with B,并且A和B是序列连续(sequentially consistent)的原子操作;
  3. A sequenced-before X,并且X simply happens-before Y,并且Y sequenced-before B;
  4. A strongly happens-before X,且 X strongly happens-before B.

如果A strongly happens-before B,那么A在全局上求值都在B之前;
strongly happens-before剔除了consume operation;

Visible side-effects

当一下条件全部满足时,数量M上的side-effect A(write)在计算B(read)的角度是可见的:

  1. A happens-before B;
  2. 在A和B之间没有其他的side-effect X.

如果A is visible to the value computation B.那么这个对于M的side-effect的遵从modification-order的最长邻近子集被称为the visible sequence of side-effects.由B决定的M值,应该是这些side-effects存(store)进去的。

注意:inter-thread synchronization 归结为:1、阻止data race(通过建立happen-before关系);2、定义在何种情况下哪些side-effects变为可见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值