我正在寻找一些在多线程代码中引起问题的ABA 问题的真实示例。
在执行原子比较和交换指令时,并发代码中会出现 ABA 问题。如果线程在执行比较和交换之前立即中断,则第二个线程可能会将比较和交换的目标从其初始值 A 更改为不同的值 B。如果然后将值更改回 A在第一个线程恢复之前,尽管目标值发生了变化,比较和交换仍将成功。
在许多情况下,ABA 不是问题。以共享引用计数为例:即使 refcount 并发改变我们也没有问题,只要我们从不从已经下降到 0 的 refcount 增加。所以我们显然只关心目标是否匹配交换时的期望值,而不是过去是否发生变化。
维基百科页面有一个受 ABA 影响的无锁堆栈实现示例,但到目前为止,我个人还没有在生产代码中遇到过这个问题。我只是好奇是否有人有一些关于 ABA 的好战争故事要分享。