2010-12-09 141 views
2

我阅读了一篇文章,描述了ABA问题,但有些东西我无法理解。我有源代码,它无法工作,它与文章中的示例类似,但我不明白这个问题。下面是文章需要帮助了解“ABA”问题

http://fara.cs.uni-potsdam.de/~jsg/nucleus/index.php?itemid=6

它说:虽然head_的实际值是相同的(一)next_指针不

但怎么可能呢?如果两个结构对象

struct node { 
    node *next; 
    data_type data; 
}; 

“head_”和“电流”指向内存中的同一区域,怎么可以前往_->未来和电流 - >下一点不同?

它还说:最后一个操作,通过foo成功进行比较和交换,当它不应该。

那该怎么办?加载相同的地址并重试?有什么不同?

目前在我的代码我有类似的情况,在那里我做比较并交换对象,这可能被另一个线程改变对象具有类似地址

deleted.compare_exchange_strong(head, 0); 

,但是如果更改对象以及初始化和它的上下一个指针包含指向初始化对象的指针,那么问题是什么?

在此先感谢。

+0

建议发布您的代码,运行时会发生什么,以及您在运行时会发生什么。那篇博文冗长而罗嗦。:)如果你真的想学习并发原语,我建议阅读Curt Schimmel的现代体系结构的Unix系统:内核程序员的对称多处理和缓存(http://www.powells.com/biblio?isbn=9780201633382) – sarnold 2010-12-09 12:24:52

+0

If我发布并解释我的代码,它将与博客中的解释完全相同,甚至可能更糟,因为我的英文不够好:)我的源代码几乎相同,并且无法正常工作,所以我想检查它是否是否真的含有ABA问题。感谢这本书:)我正在寻找一些有趣的东西来阅读。但 – ledokol 2010-12-09 12:28:37

回答

6

“head_”和“current”指向内存中的同一区域,head _-> next和current-> next指向不同?

他们不;但代码需要headhead->next稳定,而pop方法运行 - 但CAS只能确保head。它默默地认为head->next不会改变head,这是错误的。所以它读取的内容为current->next,一段时间后,它会发生变化。

它还说:最后一个操作,通过foo成功进行比较和交换,当它不应该。

那该怎么办?加载相同的地址并重试?有什么不同?

是的。该方法需要等待(或继续尝试),直到无人使用其手中的结构。

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

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