22

我正处于一个交界处,我试图在基于互斥锁的数据结构和无锁(可能还有无等待)数据结构之间选择一个。

在深入挖掘的同时,我没有发现 C++11 标准是否支持原子类型的无锁操作,甚至不支持基于宽度的积分,如atomic_uint32_t. 换句话说,不只是std::atomic<>接口没有被授予无锁;唯一看起来在整个标准库中被授予无锁的是std::atomic_flag.

这是真的还是我错过了什么?这是什么原因?我的意思是标准调用“原子”的东西显然不是无锁的,它甚至允许在后台使用互斥锁或阻塞调用。

4

2 回答 2

12

C++ 标准不保证std::atomic<T>操作是无锁的。但是,您可以使用29.6.5 [atomics.types.operations.req] 第 7 段std::atomic<T>::is_lock_free()来确定操作是否无锁:std::atomic<T>

返回: 如果对象的操作是无锁的,则返回 true,否则返回 false。

如果它不是无锁的,它仍然会执行所需的同步,但它会使用一些锁来执行此操作。

于 2013-11-11T07:06:40.560 回答
10

如果你的意思是原子的,使用没有锁的硬件支持,那么是的,标准并没有给你一个保证。为什么?好吧,因为不同的架构支持不同类型的硬件原子性。std::atomic<>具有方便的is_lock_free()方法,可用于检查给定对象是否实际上是无锁的,或者在内部使用锁来保证原子操作。您可以使用它并检查您的目标硬件是否是无锁的,然后决定使用哪种数据结构。

但是,话虽如此,如果目标架构对您感兴趣的固定宽度积分的原子操作具有硬件支持,并且您没有从贫民区的阴暗软件商店获得标准库的副本,则可能是将使用硬件而不是完整的锁。

于 2013-11-11T07:04:56.883 回答