__ATOMIC_RELAXED是什么意思?

时间:2015-09-03 13:36:03

标签: multithreading gcc

在GCC原子内置中我发现__atomic_exchange函数确实有第三个参数int memorder,它可以取值__ATOMIC_RELAXED__ATOMIC_SEQ_CST__ATOMIC_ACQUIRE,{{1 }和__ATOMIC_RELEASE

  

__ ATOMIC_RELAXED:       意味着没有线程间排序约束。

我不确定怎么会发生这种情况,这不应该是原子操作,因此不会有任何线程间的排序吗?

1 个答案:

答案 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的存储可能会重新排序。