我正在尝试使用std::原子库。
(如果存在的话)下面的non-specialized将一个值存储到一个原子对象(公共成员函数) v.s。存储 (C++11)原子地用一个非原子参数替换原子对象的值(公共成员function)
std::atomic<int> x v.s. int x的缺点是什么?换句话说,原子variable?
保护的正常变量。
这是对我的问题的参考。http://en.cppreference.com/w/cpp/atomic/atomic
发布于 2012-03-04 04:42:11
不是专家,但我会试试:
int) )包含其他操作,如fetch_add。非专用表单(用户定义的类型)将不包含these.operator=返回其参数,而store不包含.此外,非操作符允许您指定内存顺序.该标准称,store.load.load.H 223H 124相同,与上面的H 225H 126相同。以使用std::atomic_int.You的方式使用int是一种未定义的行为,您可以假设开销是int <= std::atomic <= int and std::mutex,<=的意思是“较少的开销”。因此,它可能比使用互斥锁更好(特别是对于内置类型),但比int.更糟糕。
发布于 2012-10-16 16:14:25
专用原子成员函数和非专用原子成员函数之间有什么区别?
从这些类的标准(第29.5节)的合成中可以看出,有三组不同的成员函数:
对于积分类型,最通用的operations;
以下函数之间有什么区别(如果有的话)?
operator=将值存储到原子对象(公共成员函数)中,v.s. store (C++11)原子地用非原子参数(公共成员函数)替换原子对象的值。
(...)
主要的功能区别是,非操作符版本(§29.6.5,第9-17段及以上)有一个额外的参数来指定所需的内存排序(§29.3/1)。操作符版本使用顺序一致性内存排序:
void::存储(C期望,memory_order order = memory_order_seq_cst)易失性no以外;void::store(C期望,memory_order order = memory_order_seq_cst) no以外;
要求: order参数不应是memory_order_consume、memory_order_acquire或memory_order_acq_rel。
效果:原子化地用所需的值替换由object或它所指向的值。内存根据order的值而受影响。
C A::operator=(C期望)挥发noexcept除外;C A::operator=(C期望)noexcept除外;
效果:store(desired)
返回:desired
非运算符形式是有利的,因为顺序一致性并不总是必要的,而且它可能比其他内存顺序更昂贵。通过仔细的分析,可以找到正确操作所需的最小保证,并选择一个限制较小的内存顺序,从而为优化器提供更多的回旋余地。
声明变量为原子vs.非原子变量的缺点是什么。例如,
std::atomic<int> xv.s.int x的缺点是什么?换句话说,原子变量的开销是多少?
在常规变量中使用原子变量就足以限制可能的优化数量,因为原子变量会对不可分割性和(可能的)内存排序施加额外的约束。
在需要原子变量时使用常规变量可能会引入数据竞争,这使得行为无法定义(§1.10/21):
如果一个程序在不同的线程中包含两个相互冲突的操作,至少其中一个不是原子的,并且在另一个线程之前也不会发生,那么程序的执行将包含一个数据竞赛。任何这样的数据竞争都会导致未定义的行为。
原子变量的开销取决于实现的质量。理想情况下,当需要原子操作时,原子变量的开销为零。当您不需要原子操作时,它可能带来的任何开销都是无关紧要的:您只需使用一个常规变量。
哪一个开销更大?一个原子变量,v.s.一个受互斥保护的普通变量?
原子变量没有理由比受互斥保护的普通变量具有更多的开销:最坏的情况是,原子变量就是这样实现的。但是有可能原子变量是无锁的,这将减少开销。这一性质可以用第29.6.5/7号编所述标准中所述的功能来确定:
bool atomic_is_lock_free(const *object) no境外;bool atomic_is_lock_free(const *object) noexcept;bool A::is_lock_free() const volatile;bool A::is_lock_free() const;
返回:如果对象的操作是无锁的,则为True,否则为false。
发布于 2012-03-04 04:29:34
我不是这方面的专家,但是如果我正确地理解了你参考文献中的非专业操作,就可以原子地做一件事,加载、存储、替换等等。
专门的函数原子地做两件事,即它们修改并返回原子对象,这样两个操作都会在任何其他线程处理它们之前发生。
https://stackoverflow.com/questions/9552133
复制相似问题