当我们讨论原子变量时,比如C++11的atomic<>
,它是无锁的吗?或者,无锁是不同的吗?如果我用原子变量管理一个队列,它会比一个无锁队列慢吗?
发布于 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
),用于指定是否可以对该类型进行无锁原子访问。
发布于 2012-04-11 21:35:53
无锁通常适用于多个线程之间共享的数据结构,其中的同步机制不是互斥的;其意图是所有线程都应该保持某种类型的进程,而不是在互斥锁上休眠。
atomic<T>
变量不使用锁(至少在您的平台上T
本身是原子的),但它们在上面的意义上并不是无锁的。您可以在无锁容器的实现中使用它们,但它们本身是不够的。
例如,atomic<queue<T>>
不会突然把一个普通的std::queue
变成一个无锁的数据结构。但是,您可以实现一个成员为atomic
的真正无锁的atomic_queue<T>
。
请注意,即使atomic<int>
本身是原子的,并且没有在您的平台上使用锁进行仿真,这也不会以任何有趣的方式使其无锁。从这个意义上说,普通的int
已经是无锁的:atomic<>
包装器让你显式地控制内存顺序,并访问硬件同步原语。
https://stackoverflow.com/questions/10106936
复制相似问题