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

问题描述 投票:21回答:2

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

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

这是真的还是我遗失了什么?这是什么原因?我的意思是标准称为“原子”的东西显然根本不是无锁的,甚至允许使用互斥锁或阻止呼叫。

c++ multithreading c++11 atomic
2个回答
12
投票

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

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

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


10
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.