实现无锁数据结构的典型方法是使用原子CAS操作,例如std::compare_exchange_strong
或std::compare_exchange_weak
。这种技术的使用例子可以在安东尼威廉姆斯看到#39; &#34; C ++ Concurrency in Action&#34;,其中实现了无锁堆栈。堆栈实现为带有std::atomic<node*>
头指针的链表。在推送和弹出期间,对此指针执行CAS操作。但是C ++标准保证只有std::atomic_flag
是无锁的,其他原子类型(包括std::atomic<T*>
)可能不是无锁的。
1)我是否正确理解如果std::atomic<T*>
不是无锁的(std::atomic::is_lock_free()
返回false),那么基于std::atomic<T*>
上的CAS操作的数据结构是不是无锁的?
2)如果是,那么,如果std::atomic_flag
是某些编译器唯一的无锁原子类型,那么在C ++上实现无锁数据结构的替代方法是什么?
答案 0 :(得分:3)
编译器不具有原子类型的无锁实现的唯一可能原因是处理器没有原子操作。我不知道现代处理器就是这种情况。
如果处理器不支持原子操作,您可能别无选择,只能使用互斥锁,信号量或类似的同步原语