You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于RISC-V中LR/SC锁实现的效率与虚假失败问题咨询

关于LR/SC锁的效率优势与虚假失败问题解答

一、为什么带addi x12, x0, 1的LR/SC锁更高效?

对比原子交换与LR/SC锁的核心行为差异:

  • 原子交换(amoswap)的逻辑是无论锁是否被持有,每次尝试获取锁都会执行写操作:将寄存器中的1与锁地址的值交换,再判断返回值是否为0。这类写操作会强制让缓存行进入脏状态,必须通知其他核心的对应缓存行失效,带来额外的总线同步开销。
  • 带addi x12, x0, 1的LR/SC锁逻辑是:先用lr读取锁地址的值,仅当锁处于未锁定状态(值为0)时,才调用sc尝试写入1。若锁已被持有,循环内只会重复执行读操作与判断,不会触发写操作。此时缓存行可保持共享状态(MESI协议的S状态),无需触发总线无效化事务,大幅降低了总线带宽占用与核心间缓存同步的成本。

简言之,原子交换是“先写再判断”,而LR/SC版本是“先判断再写”,避免了锁被持有期间的无效写操作,因此更高效。

二、该LR/SC锁是否无法避免虚假失败?

你的判断是正确的。

LR/SC的“虚假失败”指:无其他线程修改目标锁地址,但sc指令仍执行失败。其根源在于LR/SC的硬件实现基于缓存行粒度:

  • 只要锁所在的缓存行因其他操作(比如其他线程访问同一缓存行的其他地址、缓存行被系统回收驱逐、总线事务干扰等)失效或被驱逐,sc就会返回失败,哪怕锁地址本身的值从未被修改。
  • 书中的这个LR/SC锁实现未针对此类场景做额外处理,因此当缓存行发生上述非锁地址修改的变化时,sc会出现虚假失败,导致循环重试。

内容的提问来源于stack exchange,提问作者An5Drama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:42:07