什么专业和非专业的原子成员函数之间的区别?
如可以在这些类的在标准的synposis可以看出(§29.5),有三种不同的组成员函数:
- 最通用的一个只提供存储,负载,交流和比较交换操作;
- 除了通用类型之外,整数类型的专门化还提供原子算术和位运算;
- 除了通用指针之外,指针专用还提供指针算术运算。
以下函数之间有什么区别(如果有的话)?
operator=
将值存储到原子对象(公共成员函数)v.s.中。 store
(C++ 11)原子替换为一个非原子参数的原子对象的值(公共成员函数)
(...)
主要的功能不同的是,非运算符版本(第29.6.5节,第9-17段和更多)具有用于指定所需内存排序(第29.3/1)的额外参数。运营商版本使用顺序一致性内存排序:
void A::store(C desired, memory_order order = memory_order_seq_cst) volatile noexcept;
void A::store(C desired, memory_order order = memory_order_seq_cst) noexcept;
要求:顺序参数不应memory_order_consume
,memory_order_acquire
,也不memory_order_acq_rel
。
影响:原子上用对象或由此指向的值替换所需的值。根据order
的值 ,内存受到影响。
C A::operator=(C desired) volatile noexcept;
C A::operator=(C desired) noexcept;
效果:store(desired)
返回:desired
非操作形式是有利的,因为顺序一致性并不总是必需的,并且它可能比更昂贵的其他记忆顺序。通过仔细分析,您可以找出正确操作所需的最低限度保证,并选择限制性较低的内存排序之一,为优化程序提供更多回旋余地。
将变量声明为原子v.s.的缺点是什么?一个非原子变量。例如,std::atomic<int> x
v.s.有什么缺点? int x
?换句话说,一个原子变量的开销是多少?
当常规变量足以限制可能的优化次数时使用原子变量,因为原子变量强加了不可分割性和(可能)内存排序的附加约束。
使用时需要一个原子变量可以引入数据争经常可变的,这使得未定义的行为(§1.10/ 21):
一个程序的执行包含数据争如果它在不同的线程中包含两个冲突的动作,其中至少有一个不是原子的,并且两个线程都不会发生在另一个线程之前。任何这样的数据竞争都会导致未定义的行为。
原子变量的开销是实现质量的问题。理想情况下,当您需要原子操作时,原子变量的开销为零。当你不需要原子操作时,它可能会有的开销是无关紧要的:你只需要使用一个常规变量。
哪一个有更多的开销?一个原子变量v.s.一个由互斥锁保护的正常变量?
没有理由为一个原子变量具有比互斥保护正常的变量更多的开销:最坏的情况下,原子变量实现就这样。但是有可能原子变量是无锁的,这会涉及更少的开销。该属性可以在标准§29.6.5/ 7所描述的功能来确定:
bool atomic_is_lock_free(const volatile A *object) noexcept;
bool atomic_is_lock_free(const A *object) noexcept;
bool A::is_lock_free() const volatile noexcept;
bool A::is_lock_free() const noexcept;
返回:真如果对象的操作是无锁的,否则为false。
我认为这将是值得你花时间研究一个特定的架构原子CPU指令和内存屏障,以更好地了解如何实现原子操作的内部。请参阅此处以获取x86上的起点:http://www.mohawksoft.org/?q=node/78,并查找英特尔手册作为参考:http://www.intel.com/content/www/us /en/processors/architectures-software-developer-manuals.html – 2012-11-05 11:44:15