繁体   English   中英

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

[英]Does the C++ 11 standard guarantees that std::atomic<> is implemented as a lock-free operation?

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

虽然挖掘得更深,但我没有发现C ++ 11标准是否支持原子类型的无锁操作,甚至对于像atomic_uint32_t这样的基于宽度的积分也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()方法,该方法可用于检查给定对象实际上是否无锁,或者在内部使用锁来保证原子操作。 您可以使用它并检查您的目标硬件是否无锁,然后决定要采用的数据结构。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM