ABA问题是并发编程里面比较经典的一个问题,下面先说一下什么是ABA问题。假设有两个线程1和2,1先运行,读到一个变量值A,然后切换到线程2运行,线程2更改这个值为B,在切换到线程1继续运行前,2又把这个值改回A,这样当线程1再运行时,发现变量的值还是A,以为nothing has changed。其实这中间已经改变了一些不变性的假使。下面举个具体的例子来说明。

下面是一个lock-free的stack代码实现:

假设Stack初始如下:Top->A->B->C。

线程1执行pop操作:

ret=A;

next=B;

这时线程1中断,线程2开始运行pop:

{// Thread 2 runs pop:
    ret = A;
    next = B;

   compare_exchange_weak(A, B)// Success, top = B

   return A;

}// Now the stack is top → B → C

{// Thread 2 runs pop again:

ret = B ; next = C ;

   compare_exchange_weak(B, C)// Success, top = C

   return B;

}// Now the stack is top → C

delete B;

{// Thread 2 now pushes A back onto the stack:

A - >next = C ;

   compare_exchange_weak(C, A)// Success, top = A

}


Stack变为top->A->C。

这时线程1再切回执行compare_exchange_weak(A,B),发现top是A,没有改变,因此这个指令执行成功。但是B已经被delete了的内存,这时就会出现问题了。

ABA问题的解决方式,后面有时间了再继续研究。