在GCC atomic内置中,我发现__atomic_exchange函数确实有第三个参数int memorder,它可以接受__ATOMIC_RELAXED,__ATOMIC_SEQ_CST,__ATOMIC_ACQUIRE,__ATOMIC_RELEASE和__ATOMIC_ACQ_REL中的一个。__ATOMIC_RELAXED:没有线程间顺序约束。我不确定这是怎么发生的,这不是应该是原子操作,因此不会有任何线程间的排序吗?
__ATOMIC_RELAXED
__ATOMIC_SEQ_CST
__ATOMIC_ACQUIRE
__ATOMIC_RELEASE
__ATOMIC_ACQ_REL
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之前重新排序。
r1 == 42 && r2 == 42.
anauzrmj2#
__ATOMIC_RELAXED意味着操作本身是原子的,没有额外的排序约束。换句话说,操作本身是原子的:另一个线程只能看到操作之前或之后的状态,但永远不会看到操作部分执行的中间状态。然而,编译器,CPU和内存系统可以自由地根据其他变量的其他操作重新排序操作。(shared = 2; tmp = shared;与一个宽松的存储和加载不能运行为tmp = shared; shared = 2;. RELAXED操作 * 相同 * 变量由同一个线程仍然是有序的wrt.彼此,但不是wrt.任何其他.见http://eel.is/cdraft/intro.races#19)gcc原子基本上是C11规范的副本,不管你是在C还是C中使用它们。以下内置函数**大致符合C11内存模型的要求**。它们都以'__atomic'为前缀进行标识,并且大多数都是重载的,因此它们可以使用多种类型。⋮每个内存顺序的描述只是为了粗略地说明效果,而不是规范;**请参阅C++11内存模型以获得精确的语义。这解释了缺乏内存顺序的详细描述。因此,转向C++11 spec,我们发现__ATOMIC_RELAXED的以下细节:轻松操作:没有同步或顺序约束强加在其他读或写上,只有这个操作的原子性得到保证(请参阅下面的宽松顺序)。
shared = 2; tmp = shared;
tmp = shared; shared = 2;
2条答案
按热度按时间nzk0hqpo1#
所有这些内建都对应于新的C11标准原子性特性。标准包含了对memory_order_relaxed排序模型的完美解释和一些示例(参见7.17.3/14)
字符串
这段代码可以生成
r1 == 42 && r2 == 42.
,因为线程2中的y的存储可能会在加载r2之前重新排序。anauzrmj2#
__ATOMIC_RELAXED
意味着操作本身是原子的,没有额外的排序约束。换句话说,操作本身是原子的:另一个线程只能看到操作之前或之后的状态,但永远不会看到操作部分执行的中间状态。然而,编译器,CPU和内存系统可以自由地根据其他变量的其他操作重新排序操作。(
shared = 2; tmp = shared;
与一个宽松的存储和加载不能运行为tmp = shared; shared = 2;
. RELAXED操作 * 相同 * 变量由同一个线程仍然是有序的wrt.彼此,但不是wrt.任何其他.见http://eel.is/cdraft/intro.races#19)gcc原子基本上是C11规范的副本,不管你是在C还是C中使用它们。
以下内置函数**大致符合C11内存模型的要求**。它们都以'__atomic'为前缀进行标识,并且大多数都是重载的,因此它们可以使用多种类型。
⋮
每个内存顺序的描述只是为了粗略地说明效果,而不是规范;**请参阅C++11内存模型以获得精确的语义。
这解释了缺乏内存顺序的详细描述。因此,转向C++11 spec,我们发现
__ATOMIC_RELAXED
的以下细节:轻松操作:没有同步或顺序约束强加在其他读或写上,只有这个操作的原子性得到保证(请参阅下面的宽松顺序)。