【问题标题】:Need help in understanding the "ABA" problem需要帮助理解“ABA”问题
【发布时间】: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


【解决方案1】:

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

他们没有;但是代码需要headhead->nextpop 方法运行时都是稳定的——但CAS 只确保head 的这一点。它默默地假设head->next 不会在不更改head 的情况下更改,这是错误的。所以它读作current->next,过了一会儿,它发生了变化。

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

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

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

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

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

【讨论】:

  • 我仍然不清楚 :( 如果它们都指向同一个结构并且该结构已更改,则使用 CAS 循环不会更改任何内容。它将执行 head = current,而 head和 current 是一样的,那是什么原因呢?如果它们有相同的地址 - 它们指向同一个对象,这意味着 thir ->next 是相同的,并且不能不同。所以沉默的假设是正确的。在哪里我的逻辑有错吗?
猜你喜欢
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多