来自于关于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
where one can specify memory order for the CAS.
我的理解是,“
memory_order_acq_rel
”只会同步那些操作所需的内存位置,而其他内存位置可能保持不同步(它不会表现为内存屏障)。现在,我的问题是 - 如果我选择“
memory_order_acq_rel
”,并将其应用于整数类型,例如整数,这在现代消费者处理器(如多核Intel i7)上通常如何转换为机器代码?其他常用架构(x64、SPARC、ppc、arm)呢?特别是(假设具体编译器,比如gcc):
- 如何使用上述操作比较和交换整数位置?
- 这样的代码将产生什么指令序列?
- 在i7上,该操作是否无锁?
- 这种操作是否会在i7上运行完整的缓存一致性协议,像内存屏障一样同步不同处理器核的缓存?还是只会同步此操作所需的内存位置?
- 与前面的问题相关 - 在i7上使用
acq_rel
语义是否有任何性能优势?其他架构呢?