来自关于 C++ 原子类型和操作的C++0x 提案:
29.1 顺序和一致性 [atomics.order]
添加带有以下段落的新子条款。
枚举
memory_order
指定详细的常规(非原子)内存同步顺序,如[N2334 或其采用的后续程序添加的新部分] 中定义的,并且可以提供操作顺序。其枚举值及其含义如下。
memory_order_relaxed
该操作不对内存进行排序。
memory_order_release
对受影响的内存位置执行释放操作,从而通过应用它的原子变量使常规内存写入对其他线程可见。
memory_order_acquire
对受影响的内存位置执行获取操作,从而使通过应用它的原子变量释放的其他线程中的常规内存写入对当前线程可见。
memory_order_acq_rel
该操作具有获取和释放语义。
memory_order_seq_cst
该操作具有获取和释放语义,此外,还具有顺序一致的操作顺序。
提案中较低的:
bool A::compare_swap( C& expected, C desired, memory_order success, memory_order failure ) volatile
可以指定 CAS 的内存顺序。
我的理解是“<code>memory_order_acq_rel”只会同步操作所需的那些内存位置,而其他内存位置可能保持不同步(它不会充当内存围栏)。
现在,我的问题是 - 如果我选择“<code>memory_order_acq_rel”并应用于compare_swap
整数类型,例如整数,这通常如何转换为现代消费处理器(如多核 Intel i7)上的机器代码?其他常用的架构(x64、SPARC、ppc、arm)呢?
特别是(假设一个具体的编译器,比如 gcc):
- 如何使用上述操作比较和交换整数位置?
- 这样的代码会产生什么指令序列?
- i7的操作是无锁的吗?
- 这样的操作会运行完整的缓存一致性协议,同步不同处理器内核的缓存,就好像它是 i7 上的内存栅栏一样?还是只会同步此操作所需的内存位置?
acq_rel
与上一个问题相关 -在 i7 上使用语义是否有任何性能优势?其他架构呢?
感谢所有的答案。