首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >原子变量是无锁的吗?

原子变量是无锁的吗?
EN

Stack Overflow用户
提问于 2012-04-11 21:30:41
回答 2查看 16.5K关注 0票数 42

当我们讨论原子变量时,比如C++11的atomic<>,它是无锁的吗?或者,无锁是不同的吗?如果我用原子变量管理一个队列,它会比一个无锁队列慢吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-11 21:43:36

该标准没有指定原子对象是否是无锁的。在没有为类型T提供无锁原子操作的平台上,atomic<T>对象可以使用互斥锁来实现,而互斥锁并不是无锁的。在这种情况下,任何在其实现中使用这些对象的容器也不是无锁的。

该标准确实提供了一种检查atomic<T>变量是否无锁的方法:您可以使用var.is_lock_free()atomic_is_lock_free(&var)。在给定的程序执行中,这些函数保证总是为相同类型的T返回相同的值。对于int这样的基本类型,还提供了一些宏(例如ATOMIC_INT_LOCK_FREE),用于指定是否可以对该类型进行无锁原子访问。

票数 39
EN

Stack Overflow用户

发布于 2012-04-11 21:35:53

无锁通常适用于多个线程之间共享的数据结构,其中的同步机制不是互斥的;其意图是所有线程都应该保持某种类型的进程,而不是在互斥锁上休眠。

atomic<T>变量不使用锁(至少在您的平台上T本身是原子的),但它们在上面的意义上并不是无锁的。您可以在无锁容器的实现中使用它们,但它们本身是不够的。

例如,atomic<queue<T>>不会突然把一个普通的std::queue变成一个无锁的数据结构。但是,您可以实现一个成员为atomic的真正无锁的atomic_queue<T>

请注意,即使atomic<int>本身是原子的,并且没有在您的平台上使用锁进行仿真,这也不会以任何有趣的方式使其无锁。从这个意义上说,普通的int已经是无锁的:atomic<>包装器让你显式地控制内存顺序,并访问硬件同步原语。

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

https://stackoverflow.com/questions/10106936

复制
相关文章

相似问题

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