CAS( compare and swap) 原子操作,保证了如果需要更新的地址没有被其他进程(线程)改动过,那么它可以安全的写入。而这也是我们对于某个数据或者数据结构加锁要保护的内容,保证读写的一致性,不出现dirty data。在用户可在循环中不断执行CAS,如果共享变量没有改变,那么swap,在当前环境中写入,否则执行do-while的Retry-Loop。
1 int compare_and_swap (int* reg, int oldval, int newval) { 2 ATOMIC(); 3 int old_reg_val = *reg; 4 if (old_reg_val == oldval) 5 *reg = newval; 6 END_ATOMIC(); 7 return old_reg_val; 8 }
ABA问题最容易发生在lock free算法中的,地址被重用的情况
无锁相当于“锁”的粒度变小了,主要是“锁”HEAD和TAIL这两个关键资源。而不是整个数据结构。
参考博客:
原文:https://www.cnblogs.com/demian/p/11141733.html