实现无锁数据结构的典型方法是使用原子CAS操作,如std::compare_exchange_strong或std::compare_exchange_weak。这项技术的用法示例可以在Antony Williams的"C++ Concurrency in Action“中看到,其中实现了一个无锁堆栈。但是C++标准保证只有std::atomic_flag是无锁的,其他原子类型,包括std::atomic<T*>,可能不是无锁的。
wiki上无锁的定义:
如果任何线程的故障或挂起不能导致另一个线程的失败或挂起,则称为非阻塞算法。我认为spinlock是无锁的,或者至少是非阻塞的。但现在我不确定了。因为从定义上来说,"spinlock is not lock-free"对我来说也是有意义的。例如,如果保持自旋锁的线程被挂起,那么它将导致其他线程在外面旋转。因此,根据定义,spinlock甚至不是非阻
我过去常常看到“无锁数据结构”这个术语,并认为“那一定很复杂”。然而,我一直在读"C++ Concurrency in Action“,它似乎编写了一个无锁的数据结构,您所要做的就是停止使用互斥/锁,并将其替换为原子代码(以及可能的内存排序障碍)。编写无锁的数据结构仅仅是用原子操作替换锁的一种情况吗?