我在维基百科的实践书中调查了并发中的 ABA 问题,并且我已经阅读了以下帖子
据我了解 ABA 问题的根本原因是,在算法中我们检查该状态与以前相同,但算法暗示该状态未被触及。
具有堆栈数据结构的示例:
要将元素添加到堆栈,我们使用以下算法:
create new stack node(save to `newNode` variable)
while(true) {
oldHead = stack.get();
newNode.next = oldHead; // point_1
if(stack.compareAndSet(oldhead, newNode)) { // atomically replace head if now head same as was in start of iteration
break;
}
}
导致 ABA 问题的步骤:
初始状态
a->b->c // a-head, c- tail.
Thread_1 尝试向
d
堆栈添加值并且操作系统在操作之前暂停线程compareAndSet
(point_1)Thread_2 然后执行 pop(Thread_1 仍然挂起)
b->c // b-head, c- tail.
Thread_3 然后执行 pop(Thread_1 仍然挂起)
c // c-head, c- tail.
Thread_4 然后执行 push
a
(Thread_1 仍然挂起)a->c // a-head, c- tail.
Thread_1 唤醒并且 cas 操作成功执行,尽管在某些情况下它可能是不可取的。
虽然这个答案被接受了,但我不明白为什么自动垃圾收集会消除这个问题。
虽然我不是 CI 专家,但我知道在 C 中你不能为两个不同的对象分配一个内存范围。
你能更清楚地澄清它吗?