原子变量是无锁的吗?

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

当我们谈论原子变量时,比如C++11的

atomic<>
,它是无锁的吗?或者无锁有什么不同?如果我用原子变量管理队列,它会比无锁队列慢吗?

c++ multithreading c++11 atomic stdatomic
2个回答
46
投票

该标准没有指定原子对象是否是无锁的。在不为类型 T 提供无锁原子操作的平台上,

atomic<T>
对象可以使用互斥锁来实现,这不是无锁的。在这种情况下,在其实现中使用这些对象的任何容器也将不是无锁的。

该标准确实提供了一种方法来检查

atomic<T>
变量是否是无锁的:您可以使用
var.is_lock_free()
atomic_is_lock_free(&var)
。这些函数保证在给定程序执行时始终为相同类型
T
返回相同的值。对于诸如
int
之类的基本类型,还提供了宏(例如
ATOMIC_INT_LOCK_FREE
)来指定是否可以对该类型进行无锁原子访问。


16
投票

无锁通常适用于多个线程之间共享的数据结构,其中同步机制是不是互斥;目的是所有线程都应该继续取得某种进展,而不是在互斥锁上休眠。

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

例如,

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

请注意,即使

atomic<int>
本质上是原子的,并且在平台上没有用锁来模拟,但这并不以任何有趣的方式使其成为 无锁。从这个意义上说,Plain
int
already 无锁:
atomic<>
包装器使您可以显式控制内存排序以及对硬件同步原语的访问。

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