使用互斥元、条件变量以及future来同步数据的算法和数据结构被称为阻塞的算法和数据结构。
不使用阻塞库函数的数据结构和算法被称为非阻塞,但并非所有的这些数据结构都是无锁的。
可以使用std::atomic_flag作为自旋锁的基本互斥元
class spinlock_mutex{ std::atomic_flag flag; public: spinlock_mutex(): flag(ATOMIC_FLAG_INIT){} void lock(){ while(flag.test_and_set(std::memory_order_acquire)); } void unlock(){ flag.clear(std::memory_order_release); } };
采用循环的形式没有阻塞。
对于有资格成为无锁的数据结构,就必须能够让多于一个线程可以并发的访问此数据结构。在数据结构中使用比较/交换操作的算法经常在其中包含循环。使用比较/交换操作是因为有可能另一个线程正在同时修改数据,这种情况下,代码就需要在试图重新比较/交换前重做部分操作,如果比较/交换操作最终在其他线程都被中断的情况下成功,那么这种代码是无锁的。如果没有,最起码使用自旋,是非阻塞的而不是无锁的。
无等待的数据结构时一种无锁的数据结构,并且有着额外的特性,每个访问数据结构的线程都能在有限数量的 步骤内完成它的操作,而不用管别的线程的行为。因为其他线程的冲突而可能卷入无限次重试的算法不是无等待的。
//代码有时间再补
原文:https://www.cnblogs.com/hebust-fengyu/p/12087832.html