43

当我们谈论原子变量时,例如 C++11 的atomic<>,它是无锁的吗?或者无锁是什么不同的东西?如果我使用原子变量管理队列,它会比无锁队列慢吗?

4

2 回答 2

40

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

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

于 2012-04-11T13:43:36.393 回答
13

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

atomic<T>变量不使用锁(至少T在你的平台上是本地原子的),但在上述意义上它们不是无锁的。您可能会在实现无锁容器时使用它们,但仅靠它们是不够的。

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

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

于 2012-04-11T13:35:53.023 回答