__ATOMIC_RELAXED是什么意思

w80xi6nr  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(183)

在GCC atomic内置中,我发现__atomic_exchange函数确实有第三个参数int memorder,它可以接受__ATOMIC_RELAXED__ATOMIC_SEQ_CST__ATOMIC_ACQUIRE__ATOMIC_RELEASE__ATOMIC_ACQ_REL中的一个。
__ATOMIC_RELAXED:没有线程间顺序约束。
我不确定这是怎么发生的,这不是应该是原子操作,因此不会有任何线程间的排序吗?

nzk0hqpo

nzk0hqpo1#

所有这些内建都对应于新的C11标准原子性特性。标准包含了对memory_order_relaxed排序模型的完美解释和一些示例(参见7.17.3/14)

// Thread 1:
r1 = atomic_load_explicit(&y, memory_order_relaxed);
atomic_store_explicit(&x, r1, memory_order_relaxed);

// Thread 2:
r2 = atomic_load_explicit(&x, memory_order_relaxed);
atomic_store_explicit(&y, 42, memory_order_relaxed);

字符串
这段代码可以生成r1 == 42 && r2 == 42.,因为线程2中的y的存储可能会在加载r2之前重新排序。

anauzrmj

anauzrmj2#

__ATOMIC_RELAXED意味着操作本身是原子的,没有额外的排序约束。换句话说,操作本身是原子的:另一个线程只能看到操作之前或之后的状态,但永远不会看到操作部分执行的中间状态。然而,编译器,CPU和内存系统可以自由地根据其他变量的其他操作重新排序操作。
shared = 2; tmp = shared;与一个宽松的存储和加载不能运行为tmp = shared; shared = 2;. RELAXED操作 * 相同 * 变量由同一个线程仍然是有序的wrt.彼此,但不是wrt.任何其他.见http://eel.is/cdraft/intro.races#19)
gcc原子基本上是C
11规范的副本,不管你是在C还是C中使用它们。
以下内置函数**大致符合C
11内存模型的要求**。它们都以'__atomic'为前缀进行标识,并且大多数都是重载的,因此它们可以使用多种类型。

每个内存顺序的描述只是为了粗略地说明效果,而不是规范;**请参阅C++11内存模型以获得精确的语义。
这解释了缺乏内存顺序的详细描述。因此,转向C++11 spec,我们发现__ATOMIC_RELAXED的以下细节:
轻松操作:没有同步或顺序约束强加在其他读或写上,只有这个操作的原子性得到保证(请参阅下面的宽松顺序)。

相关问题