int*_*jay 36
该标准未指定原子对象是否无锁.在不为类型T提供无锁原子操作的平台上,atomic<T>
可以使用互斥锁来实现对象,该互斥锁不是无锁的.在这种情况下,在其实现中使用这些对象的任何容器也不会是无锁的.
该标准确实提供了一种检查atomic<T>
变量是否无锁的方法:您可以使用var.is_lock_free()
或atomic_is_lock_free(&var)
.这些函数保证T
在给定的程序执行中始终为相同类型返回相同的值.对于基本类型,例如int
,还提供了宏(例如ATOMIC_INT_LOCK_FREE
),它指定是否可以使用对该类型的无锁原子访问.
Use*_*ess 12
无锁通常适用于多线程之间共享的数据结构,其中同步机制不是互斥的; 目的是所有线程都应该继续取得某种进展,而不是睡在互斥锁上.
atomic<T>
变量不使用锁(至少T
在你的平台上本机为原子的地方),但它们在上面的意义上并不是无锁的.您可以在实现无锁容器时使用它们,但它们本身并不足够.
例如,atomic<queue<T>>
不会突然std::queue
变成无锁数据结构.但是,你可以实现一个真正无锁atomic_queue<T>
的成员atomic
.
请注意,即使atomic<int>
是本机原子并且未在您的平台上使用锁模拟,也不会以任何有趣的方式使其无锁.从这个意义上说,Plain 已经int
是无锁的:包装器可以让您明确控制内存排序,并可以访问硬件同步原语.atomic<>
归档时间: |
|
查看次数: |
13070 次 |
最近记录: |