我正处在一个交界处,我试图在基于互斥锁的数据结构和无锁(可能是无等待)数据结构之间选择一个。
在深入研究的同时,我没有发现C++11标准是否支持原子类型的无锁操作,甚至对于基于宽度的积分(如atomic_uint32_t
)也不支持。换句话说,不仅仅是std::atomic<>
接口(而不是)被授予无锁;在整个标准库中,唯一被授予无锁的东西是std::atomic_flag
。
这是真的还是我漏掉了什么?原因是什么?我的意思是,标准的调用“原子”的东西显然根本就不是无锁的,甚至允许在引擎盖下使用互斥或阻塞调用。
发布于 2013-11-11 07:06:40
C++标准并不保证std::atomic<T>
操作是无锁的.但是,您可以使用std::atomic<T>::is_lock_free()
来确定std::atomic<T>
的操作是否是无锁的29.6.5 atomics.types.operations.req第7段:
返回:如果对象的操作没有锁定,则为True,否则为false。
如果它不是无锁的,它仍然会执行所需的同步,但是它会使用一些锁来这样做。
发布于 2013-11-11 07:04:56
如果你所说的原子的意思是,使用没有锁的硬件支持,那么是的,这个标准没有给你一个保证。为什么?因为不同的架构支持不同的硬件原子性。std::atomic<>
有一个方便的is_lock_free()
方法,它可以用来检查给定的对象是否实际上是无锁的,或者在内部使用锁来保证原子操作。您可以使用它,并检查您的目标硬件是否是无锁的,然后决定采用何种数据结构。
不过,话虽如此,如果目标体系结构对你感兴趣的固定宽度积分的原子操作有硬件支持,并且没有从贫民区的shady软件商店获得标准库的副本,那么它可能会使用硬件而不是一个完整的锁。
https://stackoverflow.com/questions/19900524
复制相似问题