转 https://blog.csdn.net/linuxheik/article/details/76005374
ABA问题
在多线程环境中,使用lock-free的CAS时,如果一个线程对变量修改2次,第2次修改后的值和第1次修改前的值相同,那么可能就会出现ABA问题。以上面的例子为例:
假设有两个线程P1和P2,P1执行完int oldval=val
后被其他线程抢占。P2线程在此期间修改了val的值(可能多次修改),但最终val的值和修改前一样。当P1线程之后运行CAS函数时,并不能发现这个问题。这就是ABA问题。
解决方法
一个常用的方法是添加额外的“tag”或“stamp”位来标记是指针是否被修改过。