【发布时间】:2013-01-10 06:02:23
【问题描述】:
我正在寻找一些在多线程代码中引起问题的 ABA 问题的真实示例。
在执行原子compare-and-swap指令时,并发代码中会出现ABA问题。如果线程在执行比较和交换之前立即中断,则第二个线程可能会将比较和交换的目标从其初始值 A 更改为不同的值 B。如果然后将值更改回 A在第一个线程恢复之前,尽管目标值发生了变化,比较和交换仍将成功。
在许多情况下,ABA 不是问题。以共享引用计数为例:即使 refcount 并发改变我们也没有问题,只要我们从不从已经下降到 0 的 refcount 增加。所以我们显然只关心目标是否匹配交换时的预期值,而不是过去是否发生变化。
wikipedia page 有一个受 ABA 影响的无锁堆栈实现示例,但我个人到目前为止还没有在生产代码中遇到过这个问题。我只是想知道是否有人有一些关于 ABA 的精彩战争故事要分享。
【问题讨论】:
标签: multithreading concurrency atomic compare-and-swap