首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ 11标准是否保证std::atomic<>是作为无锁操作实现的?

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

Stack Overflow用户
提问于 2013-11-11 06:55:38
回答 2查看 3.4K关注 0票数 22

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

在深入研究的同时,我没有发现C++11标准是否支持原子类型的无锁操作,甚至对于基于宽度的积分(如atomic_uint32_t )也不支持。换句话说,不仅仅是std::atomic<>接口(而不是)被授予无锁;在整个标准库中,唯一被授予无锁的东西是std::atomic_flag

这是真的还是我漏掉了什么?原因是什么?我的意思是,标准的调用“原子”的东西显然根本就不是无锁的,甚至允许在引擎盖下使用互斥或阻塞调用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-11 07:06:40

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

返回:如果对象的操作没有锁定,则为True,否则为false。

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

票数 12
EN

Stack Overflow用户

发布于 2013-11-11 07:04:56

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

不过,话虽如此,如果目标体系结构对你感兴趣的固定宽度积分的原子操作有硬件支持,并且没有从贫民区的shady软件商店获得标准库的副本,那么它可能会使用硬件而不是一个完整的锁。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19900524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档