我在一个交叉点,我正在尝试在基于互斥锁的数据结构和无锁(可能无等待)的数据结构之间选择一个。
虽然深入挖掘,但我没有发现C ++ 11标准是否支持原子类型的无锁操作,甚至不支持基于宽度的积分(如atomic_uint32_t
)。换句话说,不仅仅std::atomic<>
接口不被授予无锁;唯一看来它被授予在整个标准库中无锁定的唯一因素是std::atomic_flag
。
这是真的还是我遗失了什么?这是什么原因?我的意思是标准称为“原子”的东西显然根本不是无锁的,甚至允许使用互斥锁或阻止呼叫。
答案 0 :(得分:12)
C ++标准不保证std::atomic<T>
操作是无锁的。但是,您可以使用std::atomic<T>::is_lock_free()
来查明std::atomic<T>
的操作是否无锁29.6.5 [atomics.types.operations.req]第7段:
返回:如果对象的操作是无锁的,则返回true,否则返回false。
如果它不是无锁的,它仍然会执行所需的同步,但它会使用一些锁来执行此操作。
答案 1 :(得分:10)
如果原子是你的意思,使用没有锁的硬件支持,那么是的,标准并没有给你一个保证。为什么?好吧,因为不同的架构支持不同类型的硬件原子性。 std::atomic<>
具有方便的is_lock_free()
方法,可用于检查给定对象实际上是否无锁,或者在内部使用锁来保证原子操作。您可以使用它并检查您的目标硬件是否可以无锁,然后决定要采用的数据结构。
然而,话虽如此,如果目标架构对您感兴趣的固定宽度积分的原子操作有硬件支持,并且您没有从贫民窟的阴暗软件商店获得标准库的副本,它可能会使用硬件而不是完全锁定。