GCC 4.7前,__sync同步原语中默认的内存模型为full barrier模型,__sync原语前后的读写操作均不可做指令重排。为提高流水线执行效率,GCC 4.7合入和C11的内存模型,通过__atomic同步原语,由使用者控制需要的屏障级别。
内存模型 |
说明 |
---|---|
__ATOMIC_RELAXED |
对其它读写操作没有同步,只保证本操作是原子的。 |
__ATOMIC_CONSUME |
load操作,当前线程依赖该原子变量的访存操作不能reorder到该指令之前,对其他线程store操作(release)可见。 |
__ATOMIC_ACQUIRE |
load操作,当前线程所有访存操作不能reorder到该指令之前,对其他线程store操作(release)可见。 |
__ATOMIC_RELEASE |
store操作,当前线程所有访存操作不能reorder到该指令之后,对其他线程load操作(consume)可见。 |
__ATOMIC_ACQ_REL |
load/store操作,memory_order_acquire + memory_order_release。 |
__ATOMIC_SEQ_CST |
memory_order_acq_rel + 顺序一致性(sequential consisten)。 |