C++ 11 标准是否保证 std::atomic<> 作为无锁操作实现?



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

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

这是真的还是我错过了什么?这是什么原因呢?我的意思是,该标准称"原子"的东西显然根本不是无锁的,甚至允许在引擎盖下使用互斥体或阻止调用。

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

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

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

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

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

最新更新