当我们谈论原子变量时,例如 C++11 的atomic<>
,它是无锁的吗?或者无锁是什么不同的东西?如果我使用原子变量管理队列,它会比无锁队列慢吗?
2 回答
该标准没有指定原子对象是否是无锁的。在不为类型 T 提供无锁原子操作的平台上,atomic<T>
可以使用互斥体来实现对象,该互斥体不是无锁的。在这种情况下,任何在其实现中使用这些对象的容器也不会是无锁的。
该标准确实提供了一种检查atomic<T>
变量是否无锁的方法:您可以使用var.is_lock_free()
或atomic_is_lock_free(&var)
。这些函数保证T
在给定的程序执行中总是为相同类型返回相同的值。对于基本类型,例如int
,还提供了宏(例如ATOMIC_INT_LOCK_FREE
),它们指定对该类型的无锁原子访问是否可用。
无锁通常适用于多线程共享的数据结构,同步机制不是互斥的;目的是所有线程都应该继续取得某种进展,而不是睡在互斥体上。
atomic<T>
变量不使用锁(至少T
在你的平台上是本地原子的),但在上述意义上它们不是无锁的。您可能会在实现无锁容器时使用它们,但仅靠它们是不够的。
例如,atomic<queue<T>>
不会突然将一个正常std::queue
的数据结构变成一个无锁的数据结构。但是,您可以实现一个真正的无锁,atomic_queue<T>
其成员是atomic
.
请注意,即使atomic<int>
是本机原子的并且没有在您的平台上使用锁进行模拟,也不会以任何有趣的方式使其成为无锁的。从这个意义上说, Plain已经int
是无锁的:包装器使您可以显式控制内存顺序,并访问硬件同步原语。atomic<>