2

我读了一篇文章,描述了 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 的比较和交换在它不应该成功的时候成功。

那么它应该怎么做呢?加载相同的地址并重试?有什么不同?

目前在我的代码中我有类似的情况,我在对象上执行 CompareAndSwap,这可能会被另一个线程更改为具有相似地址的对象

deleted.compare_exchange_strong(head, 0);

但是如果更改的对象初始化良好并且它的下一个指针包含指向初始化对象的指针,那么问题是什么?

提前致谢。

4

1 回答 1

6

“head_”和“current”指向内存中的同一个区域,head_->next和current->next怎么能指向不同呢?

他们不; 但是代码需要两者head,并且head->next在方法运行时是稳定的pop- 但 CAS 仅确保head. 它默默地假设head->next不会改变而不改变head,这是错误的。所以它会在current->next一段时间后读取一些东西,它会改变。

它还说:最后一个操作, foo 的比较和交换在它不应该成功的时候成功。

那么它应该怎么做呢?加载相同的地址并重试?有什么不同?

是的。该方法需要等待(或继续尝试),直到没有人弄乱它手下的结构。

但是如果更改的对象初始化良好并且它的下一个指针包含指向初始化对象的指针,那么问题是什么?

可以是任何东西。违反类的不变量、双重释放/内存泄漏、数据丢失等。

于 2010-12-09T12:28:14.823 回答