【发布时间】:2011-05-22 20:02:40
【问题描述】:
我阅读了一篇文章,描述了 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);
但是如果改变的对象被很好地初始化并且它的下一个指针包含指向初始化对象的指针那么问题是什么?
提前致谢。
【问题讨论】:
-
建议发布您的代码,运行时会发生什么,以及运行时您预期会发生什么。那篇博文又长又罗嗦。 :) 如果你真的想学习并发原语,我建议阅读 Curt Schimmel 的 Unix Systems for Modern Architectures:Symmetric Multiprocessing and Caching for Kernel Programmers (powells.com/biblio?isbn=9780201633382)
-
如果我发布并解释我的代码,这将与博客中的解释完全相同,甚至可能更糟,因为我的英语不够好:) 我的来源几乎相同,但它无法工作,所以我想检查它是否真的包含ABA问题。感谢这本书 :) 我正在寻找一些有趣的东西来阅读。但是
-
这对我来说似乎不是 ABA 问题。似乎确实存在一个问题,多线程,但这不是我到目前为止理解 ABA 的方式。
-
@Matthieu M:嗯..据我所知这是 ABA,但是..无论如何,不管它叫什么。有问题吗?
-
我认为你链接的文章很好地解释了 ABA 问题,我不知道你还期望什么其他解释。 en.wikipedia.org/wiki/ABA_problem 上的维基百科解释似乎更清晰、更艰难。
标签: c++ multithreading nonblocking compare-and-swap