在GCC原子内置中我发现__atomic_exchange函数确实有第三个参数int memorder,它可以取值__ATOMIC_RELAXED
,__ATOMIC_SEQ_CST
,__ATOMIC_ACQUIRE
,{{1 }和__ATOMIC_RELEASE
。
__ ATOMIC_RELAXED: 意味着没有线程间排序约束。
我不确定怎么会发生这种情况,这不应该是原子操作,因此不会有任何线程间的排序吗?
答案 0 :(得分:5)
所有这些内置对应于新的C11标准原子性特征。 Standard包含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.
,因为在加载r2之前,线程2中y的存储可能会重新排序。