我读了一篇文章,描述了ABA问题,但有些东西,我无法理解。我有源代码,它无法工作,它类似于文章中的示例,但我不明白这个问题。这是文章
http://fara.cs.uni-potsdam.de/~jsg/nucleus/index.php?itemid=6
它说:虽然head_的实际值是相同的(a),next_指针不是
但它怎么可能?如果有两个结构对象
struct node {
node *next;
data_type data;
};
“head_”和“current”指向内存中的同一区域,如何将head _-> next和current-> next指向不同?
它还说:最后一个操作,foo SUCCEEDS的比较和交换,它不应该。
那该怎么办?加载相同的地址,然后重试?有什么区别?
目前在我的代码中我有类似的情况,我在对象上做CompareAndSwap,可能被另一个线程更改为具有相似地址的对象
deleted.compare_exchange_strong(head, 0);
但是如果更改的对象被初始化很好并且它的下一个指针包含指向初始化对象的指针那么问题是什么?
提前致谢。
答案 0 :(得分:6)
“head_”和“current”指向内存中的同一区域,如何将head _-> next和current-> next指向不同?
他们没有;但是代码需要head
和head->next
在pop
方法运行时保持稳定 - 但CAS仅为head
确保了这一点。它默默地假设head->next
不会更改而不更改head
,这是错误的。所以它读取的内容为current->next
,不久之后,它会发生变化。
它还说:最后一个操作,foo SUCCEEDS的比较和交换,它不应该。
那该怎么办?加载相同的地址,然后重试?有什么区别?
是。该方法需要等待(或继续尝试),直到没有人混淆其手下的结构。
但如果更改的对象已初始化,并且下一个指针包含指向初始化对象的指针,那么问题是什么?
可能是什么。违反类的不变量,双重释放/内存泄漏,数据丢失等。