[英]Need help in understanding the “ABA” problem
我读了一篇描述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);
但是如果更改后的对象已正确初始化,并且下一个指针包含指向已初始化对象的指针,那又是什么问题呢?
提前致谢。
“ head_”和“ current”指向内存中的同一区域,head _-> next和current-> next如何指向不同?
他们不; 但是代码需要在pop
方法运行时head
和head->next
都必须稳定-但是CAS只为head
保证这一点。 它默默地假设head->next
在不更改head
情况head->next
不会更改,这是错误的。 因此它读取的内容为current->next
,不久之后,它发生了变化。
它还说:最后一个操作,不应该由foo SUCCEEDS执行比较和交换。
那应该怎么办? 加载相同的地址,然后重试? 有什么区别?
是。 该方法需要等待(或继续尝试),直到没人弄乱它下面的结构。
但是如果更改后的对象已正确初始化,并且下一个指针包含指向已初始化对象的指针,那又是什么问题呢?
可以是任何东西。 违反类的不变性,两次释放/内存泄漏,数据丢失等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.