- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center为指导。
8年前关闭。
我正在寻找一些在多线程代码中导致麻烦的 ABA 问题的真实示例。
ABA 问题在执行原子比较和交换指令时出现在并发代码中。如果线程在执行比较和交换之前立即被中断,则第二个线程可能会将比较和交换的目标从其初始值 A 更改为不同的值 B。如果它随后将值更改回 A在第一个线程恢复之前,尽管更改了目标值,比较和交换仍会成功。
在许多情况下,ABA 不是问题。以共享引用计数为例:即使引用计数并发更改我们也没有问题,只要我们永远不会从已经下降到 0 的引用计数增加。所以我们显然只关心目标是否匹配掉期时的期望值,而不是过去是否发生了变化。
wikipedia page有一个受 ABA 影响的无锁堆栈实现示例,但我个人到目前为止还没有在生产代码中遇到这个问题。我只是好奇是否有人有一些关于 ABA 的精彩 war 故事可以分享。
最佳答案
假设您要使用传统链表实现有序列表。假设您想在列表中添加一个新值 V。首先,你必须使用辅助指针AUX找到合适的位置插入新元素,并将其定位在值小于V的最后一个节点,并且还要保存AUX->next,以便在CAS操作中进行比较。获得引用后,您将 NEW->next 指向 AUX->next,然后使用 CAS 将 AUX->next 切换到 NEW,如果 AUX->next 仍然是您保存的引用。它应该是这样的:
AUX = list.HEAD;
WHILE( AUX->next.value < V)
AUX = AUX->next;
OLD = AUX->next; //line 4
NEW->next = AUX->next; //line 5
IF( CAS(AUX->next, NEW, OLD)) //line 6
Success!!!
ELSE
Try again or whatever
关于multithreading - ABA 在多线程中的真实示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14535948/
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是一年级的学生,目前正在学习“C”。这是我真正碰壁的第一个任务,任务是: “创建一个函数,它接收一个字符串指针和一个字符串大小的指针。字符串本身包含一个句子。该函数将返回一个指向最大字典大小单词开头
我必须运行一个相当旧的程序代码,它使用 ABA-provider for JCE。所有类都可以在源文件夹中找到。但是,会出现 NoSuchProviderException:“JCE 无法验证提供程序
我正在尝试从 here 实现 Michael-Scott FIFO 队列。我无法实现他们针对 ABA 问题的解决方案。我收到此错误。 error: incompatible type for argu
我目前正在使用 C++11 开发无锁单链表,我的 popFront() 函数有问题——或者我至少应该说我知道它在某些情况下会出现问题。 无论如何,这就是我目前拥有的: std::shared_ptr
在书中C++ Concurrency in Action ,作者给出了一个使用hazard pointer实现无锁栈数据结构的例子。部分代码如下: std::shared_ptr pop() {
我在维基百科的实践书中调查了并发中的 ABA 问题,我阅读了以下内容 post 据我所知,ABA 问题的根本原因是在算法中我们检查的状态与以前相同,但算法暗示状态未被触及。 堆栈数据结构示例: 我们使
我读了一篇描述 ABA 问题的文章,但有些东西我无法理解。我有源代码,它无法运行,它类似于文章中的示例,但我不明白这个问题。这是文章 http://fara.cs.uni-potsdam.de/~js
在给定两个字符的出现频率(例如:x = 5)的情况下,建议一种使用两个字符(例如:“aabba”、“aba”)的模式构造 String 的有效方法, y = 4).问题是任何字符都不应重复超过两次。
请注意,我已经知道并了解 ABA problem .这个问题是关于 .NET 内存模型在 ABA 方面的行为。 在他对 Lock-Free LIFO Stack 的讨论中(2007 年 5 月 MSD
从 AIM 7 beta 2 到现在的 AIM 7 beta 6,GM - AIM 开始使用新的 .aba 文件格式来保存文件。这些文件过去位于我们可以访问的文件夹中程序文件,但是由于“性能提升”,A
我正在阅读 lock free boost 文档的一部分,它说“使用固定大小的数组来存储内部节点”以避免在 32 位机器上防止 ABA 问题。有人可以给我提示这部分在源代码中的位置吗?整个 boost
我有一种情况需要更新候选人的选票。 公民可以投票给这个候选人,每个候选人可以投一票以上。即一个人可以投 5 票,而另一个人可以投 2 票。在这种情况下,该候选人应获得 7 票。 现在,我使用 Djan
我正在基于此实现一个无锁队列 algorithm ,它使用计数器来解决 ABA 问题。但我不知道如何用 c++11 CAS 实现这个计数器。例如,从算法: E9: if CAS(&tail.pt
我正在尝试对字符串进行排序(为 punnetsquare 制作基因型)。我当前的实现是: unsorted_genotype = 'ABaB' sorted_genotype = sorted(lis
我需要运行一个服务程序,用 FO 为 abas-ERP continuous 编写。 我听说一些已经存在的脚本可以从 shell 调用服务程序。如果可能的话,我可以简单地使用一个 cronjob 来启
当使用比较和交换 (CAS) 技术编写无锁代码时,存在称为 ABA 问题的问题: http://en.wikipedia.org/wiki/ABA_problem 因此,仅比较值“A”是有问题的,因为
我想知道为什么下面的函数会出错: #include using namespace std; class Saba { public: Saba(){ cout (sabaPtr);
在一些论坛和书籍中(即 C++ Concurrency in Action)有一个很好的多生产者/多消费者堆栈的例子,并且在 pop 实现中他们通常这样做以下内容: // head is an std
是否有任何 FO 函数或 AJO 函数来获取在屏幕编辑器中声明的必填字段? 最佳答案 据我所知FO中没有这个功能。前段时间我自己需要这些信息,我从 xml 屏幕描述文件中获取了这些信息。 必填字段看起
我是一名优秀的程序员,十分优秀!