我正在寻找一些关于ABA问题在多线程代码中造成麻烦的实际例子。
当执行一个原子的compare-and-swap指令时,ABA问题会出现在并发代码中。如果一个线程在执行compare-and-swap之前立即被中断,第二个线程可能会将compare-and-swap的目标从其初始值A更改为另一个值B。如果它然后在第一个线程恢复之前将该值改回A,则compare-and-swap将成功,尽管对目标值进行了更改。
在许多情况下,ABA不是问题。以共享引用计数为例:即使并发地更改refcount,只要我们从已经降至0的refcount中不再增加,我们就没有问题。因此,我们显然只关心目标是否与交换时的期望值匹配,而不关心它在过去是否发生了变化。
维基百科页面 有一个无锁栈实现的例子遇到了ABA问题,但我个人在生产代码中还没有遇到这个问题。我只是好奇是否有人有一些关于ABA的有趣故事可以分享。
CAS(AUX->next, NEW, OLD)
应该改为CAS(AUX->next, OLD, NEW)
,对吧? - Jason Law