【发布时间】:2011-05-11 22:36:15
【问题描述】:
来自C++0x proposal 关于 C++ 原子类型和操作:
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 指定内存顺序。
我的理解是“memory_order_acq_rel”只会同步操作所需的那些内存位置,而其他内存位置可能保持不同步(它不会充当内存围栏)。
现在,我的问题是 - 如果我选择“memory_order_acq_rel”并将compare_swap 应用于整数类型,例如整数,这通常如何在现代消费类处理器(如多核 Intel i7)上转换为机器代码?其他常用的架构(x64、SPARC、ppc、arm)呢?
特别是(假设一个具体的编译器,比如 gcc):
- 如何通过上述操作比较和交换整数位置?
- 这样的代码会产生什么样的指令序列?
- i7 上的操作是否无锁?
- 这样的操作是否会运行完整的缓存一致性协议,同步不同处理器内核的缓存,就好像它是 i7 上的内存栅栏一样?还是只是同步此操作所需的内存位置?
- 与上一个问题相关 - 在 i7 上使用
acq_rel语义是否有任何性能优势?其他架构呢?
感谢大家的回答。
【问题讨论】:
-
"来自 C++0x 关于 C++ 原子类型和操作的提案:" 你引用的文字是一个非常非常糟糕的解释。
标签: c++ multithreading gcc compare-and-swap stdatomic