问题标签 [load-link-store-conditional]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 比较和交换原子操作与加载链接/存储条件操作
在 x86 处理器下,我不确定比较和交换原子操作和加载链接/存储条件操作之间的区别。后者比前者更安全吗?是不是第一个比第二个好?
assembly - ARM LL/SC 通过寄存器宽度或缓存线宽度进行独占访问?
我正在开发我的无锁数据结构库的下一个版本,在 ARM 上使用 LL/SC。
对于我的 LL/SC 用例,我需要将它与 LDREX 和 STREX 之间的单个 STR 一起使用。(而不是用它来模拟 CAS。)
现在,我已经编写了代码,并且可以正常工作。然而,我担心的是它可能并不总是有效。如果您访问与 LL/SC 目标相同的高速缓存行,我已经在 PowerPC 上阅读过,您会破坏 LL/SC。
所以我在想,如果我的 STR 目标与我的 LL/SC 目标在同一缓存行上,那么 pow,我已经死了。
现在,LL/SC 目标和 STR 目标始终位于不同的 malloc() 中,因此它们直接位于同一缓存行中的机会可能很小(我可以通过填充 LL/SC 目标来保证这一点,因此它开始于缓存线边界并填充该缓存线)。
但是,如果 STR 目标在内存中的正确(错误!)位置,则可能存在错误共享。
查看 LDREX/STREX 文档,这描述了“物理地址”方面的独占访问。这意味着寄存器宽度粒度,而不是高速缓存行宽度粒度。
这就是我的问题——LDREX/STREX 是否对使用寄存器宽度粒度或缓存线宽度粒度的内存访问敏感?
c++ - 使用 Load-link/store-conditional 来防止 ABA 的无锁 C++11 示例?
使用比较和交换 (CAS) 技术编写无锁代码时,会出现一个称为 ABA 问题的问题:
http://en.wikipedia.org/wiki/ABA_problem
仅在值“A”上进行比较是有问题的,因为在两个观察之间仍然可能发生写入。我继续阅读并找到了这个解决方案:
http://en.wikipedia.org/wiki/LL/SC
在计算机科学中,加载链接和条件存储 (LL/SC) 是多线程中用于实现同步的一对指令。加载链接返回内存位置的当前值,而随后对同一内存位置的存储条件将仅在加载链接后该位置没有发生更新时存储新值。这共同实现了无锁原子读-修改-写操作。
如何修改典型的 C++ 无锁 CAS 技术以使用上述解决方案?有人可以举一个小例子吗?
我不介意它是否特定于 C++11/x86、x86-64 Linux(最好没有 Win32 答案)。
cpu-architecture - 与 CAS(比较和交换)相比,LL/SC 的优势是什么?
LL/SC 在计算机体系结构中与 CAS(比较和交换)相比有什么优势?我认为 LL/SC 可以在多核系统中解决活锁问题,并解决 ABA 问题,但 CAS 不能。与 CAS 相比,我找不到 LL/SC 的任何优势。谁能告诉我?
arm - ARM Cortex-M4/7:LDREX/STREX 之间的定期内存访问使独占监视器无效
我正在尝试重写一个代码部分,该部分当前可以在 STM32F7(单核,微控制器)上使用 LDREX/STREX 禁用/启用中断。
听起来像是一个简单的问题,但经过几天的研究,似乎在 ARM 文档和社区回复中都没有找到明确的答案:
LDREX/STREX 之间的常规内存访问是否会使独占监视器状态无效(因此总是使 STREX 失败)?
常识是它应该失效,但 ARM 文档仍然没有将常规内存访问作为使独占监视器失效的情况之一。
事实上,在大多数情况下,LDREX 和 STREX 之间的工作只能在寄存器中完成,所以这个问题不相关,但在我的情况下,这还不够,我需要访问内存。我基本上是在尝试做一个检测器“这些线路之间是否发生了中断?”
ST手册指出EGR是整个内存,但它仍然没有回答这个问题。
代码部分:
arm - ARM Cortex M7 何时真正需要 CLREX?
我在网上找到了几个地方,它们声明只要输入中断例程,就“必须”调用 CLREX,我不明白。CLREX状态的文档(添加编号以便于参考):
(1) 清除地址已请求独占访问的执行处理器的本地记录。
(2) 使用该
CLREX
指令将紧密耦合的独占访问监视器返回到其开放访问状态。这消除了对内存的虚拟存储的要求。(3) 是否
CLREX
还清除执行处理器的全局记录,即某个地址已请求独占访问,这是实现定义的。
我在这里几乎什么都不懂。
我的印象是,按照文档中的示例编写一些内容足以保证原子性:
为什么要清除“本地记录”?我认为
LDREX
/STREX
足以保证从几个中断对地址的原子访问?即 ARM 的 GCC 使用LDREX
/编译所有 C11 原子函数STREX
,我看不到CLREX
在任何地方被调用。第二段指的是什么“虚拟商店的要求”?
全局记录和本地记录有什么区别?多核场景需要全局记录吗?
c - AArch64 程序集中的原子链表 LIFO,在 ldxr / stxr 之间使用加载或存储
我使用 ARMv8 64 位的程序集为共享内存上下文实现了 LIFO。
LIFO 在开头插入一个节点,每个节点结构的第一个属性必须是下一个指针。
这是为 LIFO 实现原子插入和删除的正确程序集吗?
它使用LL/SC在 LDXR 和 STXR 之间进行额外的加载或存储来读取 head->next 或将指针存储到新节点中。
我对 ARM 组装真的很陌生,所以非常感谢任何帮助。
assembly - 这如何保证值已在 ARM 中自动更新?
ARM 提供 LDREX/STREX 以原子地加载/存储值,但我觉得我在这仍然是一个原子操作方面遗漏了一些东西。以下通常是如何增加一。但是,是什么阻止了某些东西在 ADD 指令期间抢占,从而使 r2 不再匹配存储在 [r0] 中的内容?
atomic - RISC-V 的“lr”指令中的“保留”是什么?
从8.2 Load-Reserved/Store-Conditional Instructions
RISC-V 的非特权 ISA 手册的章节中,
LR.W 从 rs1 中的地址加载一个字,将符号扩展值放在 rd 中,并注册一个保留集——一组字节包含寻址字中的字节。SC.W 有条件地将 rs2 中的一个字写入 rs1 中的地址:只有当保留仍然有效并且保留集包含正在写入的字节时,SC.W 才会成功。
描述中的内容是什么reservation
?它是如何在硬件中实现的?Hart 如何知道预订是否已被其他 Hart 无效?