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问题的解决方式,后面有时间了再继续研究。